Jai besoin de convertir une lettre en son index dans lalphabet, et en son index ASCII / Unicode. Et jaimerais avoir plus dun moyen de réaliser chacun des cas (parce que je me souviens quil y en a plus dun), si possible.

Dabord je voulais convertir une lettre en son index alphabétique (je me souviens certains des utilisateurs ici mont montré comment faire la conversion il y a quelque temps [soit dans le chat, soit dans la section des commentaires de lune des questions] mais je nai pas copié dexemples et jai oublié comment le faire [je ne peux pas sembler pour trouver quoi que ce soit dans les archives]), mais jai ensuite décidé dajouter un index ASCII- / Unicode dune lettre dans le mix car cela doit être une procédure assez similaire.

Je me souviens de quelque chose comme "\a pour faire référence au caractère a mais ne peut pas sembler le faire fonctionner ou me souvenir exactement à quoi il est utilisé. Je vais lire des manuels sous peu mais dans le en attendant, il était logique de poser la question car cela peut être plus rapide.

Merci.

Commentaires

  • La syntaxe est <backtick><character> pour obtenir le code de caractère du lett euh. Pour lindex alphabétique, vous pouvez simplement soustraire lindex de a (ou A respectivement).

Réponse

Le TeXBook dit:

Un nombre dans la langue de TeX peut commencer par un ", auquel cas il est considéré comme octal, ou par un ", lorsquil est considéré comme hexadécimal. Ainsi, \char"142 et \char"62 équivalent à \char98.

et

Le jeton ` 12 (guillemet gauche), lorsquil est suivi par un jeton de caractère ou par tout jeton de séquence de contrôle dont le nom est un seul caractère, représente le code interne de TeX pour le personnage en question. Par exemple, \char`b et \char`\b sont également équivalents à \char98.

Et ces codes internes sont (de lannexe C de The TeXBook ):

entrez la description de limage ici

(les nombres octaux sont représentés en italique, et les nombres hexadécimaux dans la police de la machine à écrire) qui est identique à la table ASCII.

Donc, pour TeX, tous les 98, "142, "62 et `b sont valides et représentent le même nombre .

Le TeXBook vous indique également ce que fait la primitive \number:

  • \number. Lorsque TeX développe \number, il lit le nombre qui suit (développant les jetons au fur et à mesure); le développement final consiste en la représentation décimale de ce nombre, précédée de « - » si négatif.

Vous pouvez donc ajouter les deux et avoir ce que vous voulez! Dans \number`b, \number lit le nombre `b et devient sa représentation décimale, 98, qui est le code ASCII pour b.

Si vous voulez lindex alphabétique de cette lettre, vous pouvez faire comme siracusa la suggéré et soustraire de lindex de a (ou A, sil sagit de lettres majuscules):

\the\numexpr`z-`a+1\relax % prints 26 

(vous devez ajouter 1 car `a-`a donnerait zéro). Ici, vous navez pas besoin de nombre car \numexpr sait déjà que `z et `a sont des nombres ; vous avez juste besoin de \the pour développer \numexpr.

Il en va de même pour les caractères Unicode. \number`₢ (choisi au hasard) imprime 8354, qui est la représentation décimale du point unicode U + 20A2. Bien sûr, vous avez besoin de XeTeX ou LuaTeX pour les utiliser.

Commentaires

  • Mention honorable: \lccode et \uccode.
  • @ bp2017 Eh bien, oui, cela peut fonctionner aussi. Cependant, notez que vous pouvez (mais ne devriez pas ' t, évidemment) définir \lccode`b=`a, puis \the\lccode`b sera 97, pas 98. De plus, \lccode`b est (généralement) égal à \lccode`B, alors que \number`b et \number`B sont différents. De plus, les \lccode de les caractères non alphabétiques (\lccode`!, par exemple) sont zéro, pas lindex ASCII. Il en va de même pour \uccode.
  • Il y a ' aussi \@arabic. (Il peut prendre une lettre, comme `CHAR, et se développer en chiffre.)
  • @ bp2017 Oui car \@arabic{<stuff>} se développe en \number <stuff>. Et pour TeX ‌`CHAR nest ' t une lettre (bien quelle en ressemble à une), mais un nombre . ' explique pourquoi \number (et \@arabic) fonctionne.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *