Lulatex - Errore di carattere Unicode

Sep 23 2020

Sto usando un documento \ LaTeX usando sia i caratteri Devnagari che quelli latini.

Il comando utilizzato è: lualatex -shell-escape -interaction nonstopmode

Tuttavia, nonostante la selezione dei caratteri appropriati. Il codice minimo è:

Ho anche provato a utilizzare il pacchetto polyglossia, (come da https://tex.stackexchange.com/a/24731/50653), ma ancora nessuna differenza.

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

Il risultato ottenuto è:

Mentre ci si aspetta che anche i personaggi Devanagari vengano resi.

Avevo anche provato prima

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

Risposte

8 MarcelKrüger Sep 23 2020 at 13:32

Ci sono due problemi in gioco qui: il problema principale è che il carattere selezionato non contiene i caratteri in questione, l'altro problema è che l'utilizzo dei comandi di caricamento dei caratteri di fontspec senza specificare esplicitamente uno script e la lingua predefinita per la scrittura latina e quindi non ha la forma indic script correttamente.

Se non vuoi preoccuparti dei corretti parametri di script / lingua per fontspec, puoi usare il wrapper fontspec di babel \babelfontper specificare i caratteri per le tue lingue. Affinché questo funzioni correttamente (specialmente affinché funzioni la modellazione specifica della lingua) devi indicare i cambiamenti di lingua nel tuo documento usando \selectlanguage, \foreignlanguageo gli ambienti otherlanguage/ otherlanguage*. Se scrivi un intero paragrafo in un'altra lingua puoi usare \selectlanguage{new-language}, per parti di un paragrafo c'è \foreignlanguage{new-language}{text-in-new-language}.

Puoi trovare dettagli su tutto questo nel manuale babel , sezione 1.2 (Documenti multilingue), sezione 1.7 e 1.8 (selettori della lingua di base / ausiliari) e sezione 1.14 (Selezione dei caratteri).

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

Come menzionato da Davislor in un commento, quanto segue richiede un'installazione TeX piuttosto moderna (aggiornata a febbraio 2020 o successiva) e quindi potrebbe non funzionare sul tuo sistema o interrompersi se provi a compilare il tuo documento su un altro sistema:

Se davvero, davvero non puoi inserire tali comandi di cambio di lingua, usi solo una lingua da ogni sistema di script e non ti interessa la corretta spaziatura dei paragrafi nel testo Devanagari (ad esempio perché è principalmente latino) puoi anche usare onchar=ids fonts: Sostituisci

\usepackage[hindi, english]{babel}

con

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

Quindi babel cambia automaticamente i caratteri e gli schemi di sillabazione in hindi quando incontra caratteri devanagari. (Ovviamente, puoi cambiare englishe hindise hai principalmente testo in hindi.)

1 ljrk Sep 23 2020 at 14:38

Benvenuto in TeX.SX!

Lo shaper LuaTeX dev2è stato un po 'problematico con gli script indiani, ma è stata richiamata un'altra versione deva, come menzionato inhttps://tex.stackexchange.com/a/362738/90407. Tuttavia, recentemente, LuaTeX ha anche il supporto per utilizzare lo shaper HarfBuzz invece di quello integrato. Entrambe le varianti dovrebbero dare risultati comparabili, anche se con lievi differenze. In entrambi i casi, tuttavia, è necessario creare interruttori di carattere per la nuova famiglia di caratteri. Usando la poliglossia possiamo aggiungere un'altra lingua e definire nuove famiglie di caratteri per quella lingua che gestirà automaticamente tutto il passaggio dei caratteri tra sans-serif e 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}

Il risultato è:

LuaTeX con HarfBuzz (LuaHBTeX)

In alternativa, non definiamo un nuovo script ma chiediamo semplicemente ad HarfBuzz di fare il lavoro pesante:

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

Che produce:


Prendendo come riferimento il rendering del mio browser, questo mi sembra abbastanza a posto.


Se non ti interessa la spaziatura corretta, puoi farlo senza poliglossia, con qualcosa del genere:

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Tuttavia, questo cambierà solo il carattere e eliminerà qualsiasi altra regolazione della lingua altrimenti implementata dalla poliglossia.