Lulatex - Erreur de caractère Unicode

Sep 23 2020

J'utilise un document \ LaTeX en utilisant à la fois les polices Devnagari et Latin.

La commande utilisée est: lualatex -shell-escape -interaction nonstopmode

Cependant, malgré la sélection des polices appropriées. Le code minimal est:

J'ai également essayé d'utiliser le package polyglossia, (selon https://tex.stackexchange.com/a/24731/50653), mais toujours pas de différence.

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

Le résultat obtenu est:

Alors que l'on s'attend à ce que les caractères Devanagari soient également rendus.

J'avais aussi essayé plus tôt

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

Réponses

8 MarcelKrüger Sep 23 2020 at 13:32

Il y a deux problèmes en jeu ici: le principal problème est que la police sélectionnée ne contient pas les caractères en question, l'autre problème est que l'utilisation des commandes fontspec fontloading sans spécifier explicitement un script et une langue par défaut en script latin et ne forme donc pas indic scripts correctement.

Si vous ne voulez pas vous soucier des bons paramètres de script / langue pour fontspec, vous pouvez utiliser le wrapper fontspec de babel \babelfontpour spécifier les polices pour vos langues. Pour que cela fonctionne correctement ( en particulier pour la mise en forme spécifique de la langue au travail) , vous devez indiquer les changements de langue dans votre document à l' aide \selectlanguage, \foreignlanguageou les otherlanguage/ otherlanguage*environnements. Si vous écrivez un paragraphe entier dans une autre langue, vous pouvez utiliser \selectlanguage{new-language}, pour des parties d'un paragraphe il y en a \foreignlanguage{new-language}{text-in-new-language}.

Vous pouvez trouver des détails sur tout cela dans le manuel babel , section 1.2 (Documents multilingues), section 1.7 et 1.8 (sélecteurs de langue de base / auxiliaires) et section 1.14 (Sélection des polices).

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

Comme Davislor l'a mentionné dans un commentaire, ce qui suit nécessite une installation TeX assez moderne (mise à jour en février 2020 ou plus tard) et peut donc ne pas fonctionner sur votre système ou s'arrêter si vous essayez de compiler votre document sur un autre système:

Si vous ne pouvez vraiment, vraiment pas insérer de telles commandes de changement de langue, vous n'utilisez qu'une seule langue de chaque système de script et vous ne vous souciez pas de l'espacement des paragraphes approprié dans le texte Devanagari (par exemple parce qu'il est principalement latin), vous pouvez également utiliser onchar=ids fonts: Remplacer

\usepackage[hindi, english]{babel}

avec

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

Ensuite, babel bascule automatiquement la police et les motifs de césure en hindi lorsqu'il rencontre des caractères Devanagari. (Bien sûr, vous pouvez changer englishet hindisi vous avez principalement du texte en hindi.)

1 ljrk Sep 23 2020 at 14:38

Bienvenue sur TeX.SX!

Le shaper LuaTeX dev2a été un peu gênant avec les scripts Indic, mais il y a eu une autre version appelée deva, comme mentionné danshttps://tex.stackexchange.com/a/362738/90407. Cependant, récemment, LuaTeX a également pris en charge l'utilisation du shaper HarfBuzz au lieu de celui intégré. Les deux variantes devraient donner des résultats comparables, mais avec de légères différences. Dans les deux cas, nous devons cependant créer des commutateurs de police pour la nouvelle famille de polices. En utilisant polyglossia, nous pouvons ajouter une autre langue et définir de nouvelles familles de polices pour cette langue qui gèreront automatiquement toutes les polices de commutation entre sans-serif et serif:

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

Le résultat est:

LuaTeX avec HarfBuzz (LuaHBTeX)

Alternativement, nous ne définissons pas de nouveau script mais demandons simplement à HarfBuzz de faire le gros du travail:

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

Ce qui donne:


En prenant le rendu de mon navigateur comme référence, cela me semble tout à fait correct.


Si vous ne vous souciez pas de l'espacement approprié, vous pouvez le faire sans polyglossie, avec quelque chose comme ceci:

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Cependant, cela ne changera que la police et supprimera tout autre ajustement de langue autrement implémenté par polyglossia.