Luego de mucho luchar pudimos dar con el arreglo de este asunto que agunos lectores de nuestra web han presentado. Si deseas aportar algún detalle no dejes de dejar tu comentario.
Solución:
U + 200B es el espacio de ancho cero que tiene aquí:
elim}
desde el final de esta línea
DeclareMultiCiteCommandparencites[mkbibparens]parencitemulticitedelim
es (usando este convertidor Unicode)
U+0065 LATIN SMALL LETTER E e
U+006c LATIN SMALL LETTER L l
U+0069 LATIN SMALL LETTER I i
U+006d LATIN SMALL LETTER M m
U+200c ZERO WIDTH NON-JOINER
U+200b ZERO WIDTH SPACE ​
U+007d RIGHT CURLY BRACKET } } rbrace
elimine esa línea y vuelva a escribir sin los caracteres de control invisibles entre m
y }
Este es uno de los principales éxitos para U + 200B y LaTeX, por lo que publicaré soluciones aquí.
Tome el siguiente ejemplo:
tracinglostchars=2
documentclassarticle
pagestyleempty
begindocumentfl fl flenddocument
En LuaLaTeX, se compila para:
El primer fl no tiene ligadura porque inserté U + 200B, un espacio de ancho cero. El segundo no tiene ligadura porque inserté U + 200C, un no ensamblador de ancho cero. Estos podrían haber estado en la fuente original desde la que copiaste intencionalmente: un espacio de ancho cero podría significar un posible salto de línea, como después de una barra, y un no ensamblador de ancho cero deshabilita una ligadura. Por ejemplo, se supone que la fi en Elfin o la fl en Halfling (según pedantes como yo) no deben estar ligadas, ya que pertenecen a diferentes partes de una palabra compuesta. Casi nadie se molesta en hacer eso, pero es mucho más común en algunos otros idiomas.
Si intenta compilarlo en PDFLaTeX, obtendrá el mensaje de error que lo trajo aquí:
! Package inputenc Error: Unicode character (U+200B)
(inputenc) not set up for use with LaTeX.
Hay varias formas de solucionarlo.
Limpia tu fuente a mano
Esto es lo que recomienda la mayoría de las personas en este sitio. Es posible que su editor tenga una forma de mostrar caracteres especiales para que pueda eliminarlos todos. Pero realmente, ¿no es este un trabajo para una computadora?
Limpia tu fuente en tu editor
Esto es más difícil con un carácter invisible de ancho cero, pero es posible que pueda copiar un espacio de ancho cero de un mapa de caracteres, abrir su cuadro de diálogo de búsqueda y reemplazo y pegar el carácter en el campo de búsqueda. Luego puede reemplazarlo con algo como ZWS
o hskip 0pt
.
Limpia tu fuente con Perl
El siguiente script de Perl de una línea creará un nuevo archivo fuente con todos los espacios de ancho cero eliminados:
perl -CSD -pe "s/NU+200B//gu" < U200B.tex > noU200B.tex
Si es más fácil de recordar, también puede escribir esto como
perl -CSD -pe "s/NZERO WIDTH SPACE//gu" < U200B.tex > noU200B.tex
los -CSD
La opción selecciona UTF-8 incondicionalmente, incluso si no tiene UTF-8 como configuración regional predeterminada. los -pe
La opción ejecuta el script Perl dado en el archivo de entrada y se imprime en el archivo de salida. los s
comando hace sustitución, el N...
es una expresión regular que coincide con el espacio de ancho cero, el campo vacío entre //
significa reemplazar con nada, y gu
significa reemplazar todas las instancias globalmente en el Unicode string. Entonces el <
y >
los operadores seleccionan los archivos de entrada y salida.
Cualquiera de estos produce un archivo que se compila para:
También es posible eliminar automáticamente todos los caracteres fuera de un subconjunto determinado. La secuencia de comandos
perl -CSD -pe "s/[^pWordpPunctpSymbolpMarkpPerlSpace]//gu"
sólo permite lo siguiente: caracteres de “palabra” Unicode, puntuación, símbolos, acentos y algunos tipos de espacios. Borra la mayoría de los personajes invisibles. Una versión aún más restrictiva sería
perl -CSD -pe "s/[^pASCII]//gu"
Esto elimina todos los caracteres excepto el ASCII originalmente permitido en TeX (incluido “
en lugar de doble tilde).
Y sí, podríamos reemplazar el espacio de ancho cero por algo en lugar de nada. La secuencia de comandos
perl -CSD -pe "s/NZERO WIDTH SPACE/\\hskip 0pt/gu; s/NZERO WIDTH NON-JOINER//gu"
dado el MWE anterior como entrada, produce la siguiente salida:
tracinglostchars=2
documentclassarticle
pagestyleempty
begindocumentfhskip 0ptl fl flenddocument
Enseñe a LaTeX a comprender el espacio de ancho cero
Si el problema es que U + 200B “no está configurado para usarse con LaTeX”, pero es equivalente a un comando TeX—hskip 0pt
o hspace0pt
son espacios de ancho cero que evitan las ligaduras y permiten un posible salto de línea; podemos configurar el carácter para usar ese comando.
tracinglostchars=2
documentclassarticle
usepackageiftex
pagestyleempty
ifTUTeX
usepackagefontspec
else
usepackage[T1]fontenc
usepackage[utf8]inputenc % The default since 2018
DeclareUnicodeCharacter200Bhskip 0pt
fi
begindocumentfl fl flenddocument
Aunque el DeclareUnicodeCharacter
el comando está en inputenc
, el kernel de LaTeX lo ha cargado de forma predeterminada desde 2018. Por lo tanto, podríamos haber omitido declararlo.