Lulatex - Error de carácter Unicode

Sep 23 2020

Estoy usando un documento \ LaTeX usando fuentes Devnagari y latinas.

El comando utilizado es: lualatex -shell-escape -interaction nonstopmode

Sin embargo, a pesar de seleccionar las fuentes adecuadas. El código mínimo es:

También intenté usar el paquete de poliglosia, (según https://tex.stackexchange.com/a/24731/50653), pero todavía no hay diferencia.

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

El resultado obtenido es:

Mientras que uno espera que los personajes de Devanagari también se representen.

También lo había intentado antes

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

Respuestas

8 MarcelKrüger Sep 23 2020 at 13:32

Hay dos cuestiones en juego aquí: el problema principal es que la fuente seleccionada no contiene los caracteres en cuestión, el otro problema es que el uso de los comandos de carga de fuentes de especificación de fuente sin especificar explícitamente un guión y el idioma predeterminado para el alfabeto latino y, por lo tanto, no da forma a indic guiones correctamente.

Si no desea preocuparse por los parámetros correctos de script / idioma para fontspec, puede usar el contenedor fontspec de babel \babelfontpara especificar las fuentes para sus idiomas. Para que esto funcione correctamente (especialmente para que funcione la configuración específica del idioma), debe indicar los cambios de idioma en su documento utilizando \selectlanguage, \foreignlanguageo los entornos otherlanguage/ otherlanguage*. Si escribe un párrafo completo en otro idioma que pueda usar \selectlanguage{new-language}, para partes de un párrafo existe \foreignlanguage{new-language}{text-in-new-language}.

Puede encontrar detalles sobre todo esto en el manual de babel , sección 1.2 (Documentos multilingües), sección 1.7 y 1.8 (Selectores de idioma básico / auxiliar) y sección 1.14 (Selección de fuentes).

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

Como Davislor mencionó en un comentario, lo siguiente requiere una instalación de TeX bastante moderna (actualizada en febrero de 2020 o posterior) y, por lo tanto, es posible que no funcione en su sistema o se rompa si intenta compilar su documento en otro sistema:

Si realmente, realmente no puede insertar dichos comandos de cambio de idioma, solo usa un idioma de cada sistema de escritura y no le importa el espaciado adecuado entre párrafos en el texto Devanagari (por ejemplo, porque es principalmente en latín), también puede usar onchar=ids fonts: Reemplazar

\usepackage[hindi, english]{babel}

con

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

Luego, babel cambia automáticamente los patrones de fuente y separación de palabras al hindi cuando encuentra caracteres devanagari. (Por supuesto, puede cambiar englishy hindisi la mayoría tiene texto en hindi).

1 ljrk Sep 23 2020 at 14:38

¡Bienvenido a TeX.SX!

El modelador de LuaTeX dev2ha sido un poco problemático con los scripts índicos, pero se ha llamado devaa otra versión , como se menciona enhttps://tex.stackexchange.com/a/362738/90407. Sin embargo, recientemente, LuaTeX tiene soporte adicional para usar el modelador HarfBuzz en lugar del integrado. Ambas variantes deberían dar resultados comparables, aunque con ligeras diferencias. Sin embargo, en ambos casos necesitamos crear interruptores de fuente para la nueva familia de fuentes. Usando la poliglosia podemos agregar otro idioma y definir nuevas familias de fuentes para ese idioma que manejará todo el cambio de fuente entre sans-serif y serif automáticamente:

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}

El resultado es:

LuaTeX con HarfBuzz (LuaHBTeX)

Alternativamente, no definimos un nuevo script, simplemente le pedimos a HarfBuzz que haga el trabajo pesado:

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

Cuyos rendimientos:


Tomando la representación de mi navegador como referencia, esto me parece bastante bien.


Si no le importa el espaciado adecuado, puede hacerlo sin poliglosia, con algo como esto:

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Sin embargo, esto solo cambiará la fuente y eliminará cualquier otro ajuste de idioma implementado por la poliglosia.