Du “Symbol” au grec (script InDesign)
May 12, 2019 | Snippets | fr | en
La bonne vieille police Symbol n'est d'aucune façon adaptée à la composition d'un texte en grec. Elle ne propose qu'un sous-ensemble rudimentaire de l'alphabet requis, sans diacritiques, si bien qu'on l'emploie à mauvais escient ou comme pis-aller quand le texte invoque des variables mathématiques ou décline ponctuellement l'étymologie d'un mot. L'inconvénient, c'est que les caractères Symbol ne sont pas alignés sur la norme Unicode et établissent une correspondance « bête et méchante » avec l'alphabet latin : a
code α, b
code β, g
code γ, etc.
Aujourd'hui, tout maquettiste InDesign qui se respecte possède au moins une police de caractères supportant les glyphes grecs indépendamment des glyphes latins. Même si la fonte n'est pas complète, elle contiendra au minimum les éléments de la police Symbol avec un encodage Unicode valide et un dessin mieux ajusté à la typographie de l'ouvrage. Au démarrage de la mise en page, une fois le texte importé, il peut donc se trouver que des glyphes faussement grecs polluent votre style de paragraphe courant :
alors que tout le matériel nécessaire est en fait disponible dans la fonte d'accueil :
Dans ce contexte, le problème est de remplacer la police Symbol par la vôtre, mais un remplacement sauvage (ou l'application programmée d'un style de caractère) ne fonctionnera pas comme vous l'espériez, car les caractères sous-jacents ne correspondent pas à leur rang Unicode. Il est donc nécessaire de transformer les caractères concernés par une sorte de translittération Symbol -> Unicode
. C'est l'opération que réalise le script ci-dessous :
//================================ // Traduit les lettres Symbol en vrais caracteres grecs (Unicode) // (Selectionnez le texte cible avant de lancer le script.) //================================ ($.global.REPLACE=function($0,q) //---------------------------------- // String.replace callback. { return (q=callee.MAP).hasOwnProperty($0) ? q[$0] : $0; }).MAP = //---------------------------------- // Map letters from the Symbol font to Greek letters. { "a": "α", //alpha "b": "β", //beta "g": "γ", //gamma "d": "δ", //delta "e": "ε", //epsilon "z": "ζ", //zeta "h": "η", //eta "q": "θ", //theta "i": "ι", //iota "k": "κ", //kappa "l": "λ", //lamda "m": "μ", //mu "n": "ν", //nu "x": "ξ", //xi "o": "ο", //omicron "p": "π", //pi "r": "ρ", //rho "s": "σ", //sigma "t": "τ", //tau "u": "υ", //upsilon "f": "φ", //phi "c": "χ", //chi "y": "ψ", //psi "w": "ω", //omega // --- "j": "ϕ", // phi_symbol "v": "ϖ", // pi_symbol "¡": "ϒ", // upsilon_hook_symbol // --- "A": "Α", // Alpha "B": "Β", // Beta "G": "Γ", // Gamma "D": "Δ", // Delta "E": "Ε", // Epsilon "Z": "Ζ", // Zeta "H": "Η", // Eta "Q": "Θ", // Theta "I": "Ι", // Iota "K": "Κ", // Kappa "L": "Λ", // Lamda "M": "Μ", // Mu "N": "Ν", // Nu "X": "Ξ", // Xi "O": "Ο", // Omicron "P": "Π", // Pi "R": "Ρ", // Rho "S": "Σ", // Sigma "T": "Τ", // Tau "U": "Υ", // Upsilon "F": "Φ", // Phi "C": "Χ", // Chi "Y": "Ψ", // Psi "W": "Ω", // Omega // --- "J": "ϑ", // theta_symbol "V": "ς", // sigma_final }; function run( s,a,t) //---------------------------------- // Main routine. { // Checkpoint. // --- (s=app.properties.selection) && (s=s[0]); if( !s || !('textStyleRanges' in s) ) return 0; // Constants. // --- const ST_C = +StyleType.CHARACTER_STYLE_TYPE; const OT_C = +OverrideType.CHARACTER_ONLY; const RE = /./g; const RF = $.global.REPLACE; // Loop. // --- a = s.textStyleRanges.everyItem() .texts.everyItem().getElements(); while( t=a.pop() ) { if( !t.textHasOverrides(ST_C,false) ) continue; t.clearOverrides(OT_C); t.contents = t.contents.replace(RE, RF); } }; app.doScript(run,void 0,void 0,UndoModes.ENTIRE_SCRIPT, "Symbol2Greek");
Ce bout de code s'ajusterait aisément à d'autres situations impliquant un scénario de ré-encodage différent. En effet, au lieu de rechercher explicitement la police Symbol, il détecte les segments de texte affectés d'une surcharge de style (en l'espèce, une police étrangère au style de paragraphe courant) et applique l'opération à ces segments particuliers. Il suffit donc de sélectionner les mots ou lignes nécessitant une translittération, le script fera le reste.
Si votre texte contient uniquement des occurrences inopportunes de caractères Symbol, vous pouvez simplement sélectionner le bloc conteneur avant exécution. Dans le cas général, il reste plus prudent d'appliquer ce script localement. (L'option Annuler est toujours disponible en cas d'erreur.)