Lulatex - Unicode-Zeichenfehler

Sep 23 2020

Ich verwende ein \ LaTeX-Dokument mit Devnagari- und Latin-Schriftarten.

Der verwendete Befehl lautet: lualatex -shell-escape -interaction nonstopmode

Trotz Auswahl der entsprechenden Schriftarten. Der minimale Code lautet:

Ich habe auch versucht, das Polyglossia-Paket zu verwenden (gemäß https://tex.stackexchange.com/a/24731/50653), aber immer noch kein Unterschied.

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

Das erhaltene Ergebnis ist:

Man erwartet zwar, dass auch die Devanagari-Charaktere gerendert werden.

Ich hatte es früher auch versucht

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

Antworten

8 MarcelKrüger Sep 23 2020 at 13:32

Hier spielen zwei Probleme eine Rolle: Das Hauptproblem besteht darin, dass die ausgewählte Schriftart nicht die fraglichen Zeichen enthält. Das andere Problem besteht darin, dass fontspec-Befehle zum Laden von Schriftarten verwendet werden, ohne explizit ein Skript und eine Sprache anzugeben, die standardmäßig in lateinischer Schrift verwendet werden, und daher keine Anzeigeform aufweist Skripte richtig.

Wenn Sie sich nicht um die richtigen Skript- / Sprachparameter für fontspec kümmern möchten, können Sie den fontspec-Wrapper \babelfontvon babel verwenden , um die Schriftarten für Ihre Sprachen anzugeben. Damit dies korrekt arbeitet (vor allem für sprachspezifische Formgebung Arbeit) , müssen Sie die Sprache aus Änderungen in Ihrem Dokument anzuzeigen , verwenden \selectlanguage, \foreignlanguageoder das otherlanguage/ otherlanguage*Umgebungen. Wenn Sie einen ganzen Absatz in einer anderen Sprache schreiben, die Sie verwenden können \selectlanguage{new-language}, gibt es für Teile eines Absatzes \foreignlanguage{new-language}{text-in-new-language}.

Details dazu finden Sie im Babel-Handbuch , Abschnitt 1.2 (Mehrsprachige Dokumente), Abschnitt 1.7 und 1.8 (Grund- / Hilfssprachenauswahl) und Abschnitt 1.14 (Auswahl von Schriftarten).

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

Wie Davislor in einem Kommentar erwähnt hat, erfordert Folgendes eine ziemlich moderne TeX-Installation (aktualisiert im Februar 2020 oder später) und funktioniert daher möglicherweise nicht auf Ihrem System oder funktioniert nicht, wenn Sie versuchen, Ihr Dokument auf einem anderen System zu kompilieren:

Wenn Sie solche Sprachumschaltbefehle wirklich, wirklich nicht einfügen können, verwenden Sie nur eine Sprache aus jedem Skriptsystem, und Sie kümmern sich nicht um den richtigen Absatzabstand in Devanagari-Text (z. B. weil es hauptsächlich lateinisch ist). Sie können auch onchar=ids fontsFolgendes verwenden : Ersetzen

\usepackage[hindi, english]{babel}

mit

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

Dann schaltet babel die Schrift- und Silbentrennungsmuster automatisch auf Hindi um, wenn es auf Devanagari-Zeichen trifft. (Natürlich können Sie wechseln englishund hindiwenn Sie meistens Hindi-Text haben.)

1 ljrk Sep 23 2020 at 14:38

Willkommen bei TeX.SX!

Der LuaTeX-Shaper dev2war mit Indic-Skripten etwas problematisch, aber es wurde eine andere Version aufgerufen deva, wie in erwähnthttps://tex.stackexchange.com/a/362738/90407. In jüngster Zeit unterstützt LuaTeX jedoch zusätzlich die Verwendung des HarfBuzz-Shapers anstelle des integrierten. Beide Varianten sollten vergleichbare Ergebnisse liefern, wenn auch mit geringfügigen Unterschieden. In beiden Fällen müssen wir jedoch Schriftartenschalter für die neue Schriftfamilie erstellen. Mit Polyglossia können wir eine weitere Sprache hinzufügen und neue Schriftfamilien für diese Sprache definieren, die den gesamten Schriftwechsel zwischen serifenlos und serifenlos automatisch handhaben:

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}

Das Ergebnis ist:

LuaTeX mit HarfBuzz (LuaHBTeX)

Alternativ definieren wir kein neues Skript, sondern bitten HarfBuzz einfach, das schwere Heben durchzuführen:

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

Welche Ausbeuten:


Wenn ich das Rendern meines Browsers als Referenz nehme, sieht das für mich ganz in Ordnung aus.


Wenn Sie sich nicht für den richtigen Abstand interessieren, können Sie dies ohne Polyglossie tun.

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Dies ändert jedoch nur die Schriftart und beseitigt alle anderen Sprachanpassungen, die ansonsten von Polyglossia implementiert werden.