Estilos GREP de inDesign

Tengo algunos documentos que tienen líneas legales para 4 países diferentes (Japón, China, Macao y árabe) La línea legal está compuesta en su mayor parte por caracteres en inglés y luego los caracteres japoneses, chinos, etc. Por ejemplo: caracteres chinos TM y © Mi empresa. Reservados todos los derechos.

He seguido algunos tutoriales para fuentes duales usando estilos GREP. Para cada país, he creado 4 estilos de personajes diferentes. Cada uno con su propia fuente designada. El cuadro de texto del documento está vinculado a un estilo de párrafo que contiene la fuente en inglés que me gustaría usar (Arial). Estoy usando rangos Unicode para cada idioma. Por ejemplo, los rangos de China CJK son 4E00–9FD5

Mis estilos GREP son los siguientes:

Aplicar estilo: Macao
al texto:[\x{4E00}-\x{9FD5}\x{3000}-\x{303F}]+

Aplicar estilo: China
al texto:[\x{3000}-\x{efff}\x{4E00}-\x{9FD5}\x{3300}-\x{33FF}][^.,;:?!\d]+

Aplicar estilo: Japón
al texto:[\x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{FF00}-\x{FFEF}\x{3000}-\x{303F}\x{4E00}-\x{9FD5}]+

Aplicar estilo: árabe
al texto:[\x{0600}-\x{06FF}\x{0750}-\x{077F}][^.,;:?!\d]+

El estilo GREP anterior funciona bien para los documentos japoneses, pero no funciona para los documentos chinos o de Macao. Si cambio el orden de los estilos GREP para que funcionen los archivos en chino o Macao, entonces el documento en japonés deja de funcionar.

Mi dilema es que no puedo tener documentos diferentes para cada país y cargar su propio estilo grep ya que los documentos comparten contenido entre sí.

Me preguntaba si hay un orden de estilos GREP específico que debería seguir o me estoy perdiendo algo tan fundamental para que funcione correctamente en los 4 idiomas.

¿Por qué está utilizando fuentes diferentes para China y Macao? Es de suponer que ambos están escritos en mandarín en caracteres simplificados, entonces, ¿por qué tener dos estilos diferentes?

Respuestas (1)

El motor de expresiones regulares elige la primera coincidencia posible. Por ejemplo, la expresión regular foo|foo barnunca coincidirá foo barsimplemente porque siempre coincidirá con foo primero. Vea cómo el motor hace un partido y continúa su trabajo de forma que apunta hacia adelante, sin mirar nunca hacia atrás.

Algo similar sucede con los estilos GREP. Excepto que sucede a la inversa, ya que los estilos individuales se aplican por separado y el último de la lista tiene prioridad. Así que el último estilo anula a los demás. Entonces, simplemente, China anulará a Japón si está debajo de Japón en la lista porque Japón es principalmente un subconjunto de China de la forma en que lo ha expresado.

Arreglando tus problemas

Bien, entonces, ¿cómo arreglar esto? ¡No estoy seguro de que sea posible siempre que ambos usen los mismos rangos de kanji! Este no es el tipo de cosas en las que grep es bueno. A menos que pueda hacer que los rangos no se superpongan por completo.

Sin embargo, es casi seguro que sus expresiones GREP son incorrectas. veamos primero las partes individuales

[\x{3000}-\x{efff}\x{4E00}-\x{9FD5}\x{3300}-\x{33FF}]

mire 3000 < 3300 < 4E00y EFFF > 9FD5 > 33FFesto significa que los rangos después del primero son redundantes, y es equivalente a escribir:

[\x{3000}-\x{efff}]

Eso es si no hay ningún error en el motor de búsqueda. Lo segundo es que usas dos lógicas de coincidencia diferentes:

  • patrón cualquier cantidad de cosas en el rango utilizado por Macao y Japón

    [...]+usa esta lógica)

  • patrón cualquier cantidad de cosas seguidas por cualquier cosa excepto las utilizadas por China y árabe

    [...][^.,;:?!\d]+

Ahora el segundo de tus patrones es realmente raro. Da como resultado, por ejemplo, el estilo árabe utilizado incluso si la última parte de la oración está en japonés, mientras que el japonés no es tan codicioso para igualar. Es casi seguro que esto no es lo que pretendías. Además, dificultará la depuración.

Intentando arreglar esto

Como dije, no estoy seguro de que sea posible. Podría intentar usar una estrategia diferente en lugar de hacer coincidir cualquier cantidad de cosas en un conjunto, siempre que no viole el conjunto. Para ello es necesario utilizar lookaheads. Desafortunadamente, las búsquedas anticipadas no tienen un ancho infinito, por lo que es posible que esto no funcione muy bien para usted. En esencia, las expresiones regulares no están realmente preparadas para este trabajo.

Se abre una estrategia alternativa si tiene algún carácter o posición que pueda hacer coincidir al principio y al final de su texto. como el comienzo del párrafo y el final del párrafo, entonces puede hacer coincidir fácilmente un rango que DEBE comenzar/terminar con ese carácter y descartará cualquier cosa que contenga algo no válido.

Entonces, supongamos que desea hacer esto por párrafo, para simplificar la prueba, el párrafo solo puede contener letras ASCII en minúsculas y el espacio, el punto y la coma coincidirían ^[a-z .,]+$:

the old man sighed but did not answer, and they moved on 
in silence. the surf grew suddenly louder, as they emerged
from the forest upon a stretch of sand dunes bordering the sea. 

pero no

The old man sighed but did not answer, and they moved on 
in silence. The surf grew suddenly louder, as they emerged
from the forest upon a stretch of sand dunes bordering the sea. 

En la cuenta de que hay un carácter inválido en el medio.

PD

De cualquier manera, debe reconocer que las expresiones regulares no están a la altura de todos los trabajos en los que desea heurísticas automatizadas. Este es probablemente uno de ellos. Usa algo más sofisticado.