Ich muss einen Buchstaben in seinen Index im Alphabet und in seinen ASCII / Unicode-Index konvertieren. Und möchte, wenn möglich, mehr als einen Weg haben, um jeden der Fälle zu erreichen (weil ich mich erinnere, dass es mehr als einen gibt).

Zuerst wollte ich einen Buchstaben in seinen Alphabetindex konvertieren (ich erinnere mich Einige der Benutzer hier haben mir vor einiger Zeit gezeigt, wie man die Konvertierung durchführt [entweder im Chat oder im Kommentarbereich zu einer der Fragen], aber ich habe keine Beispiele kopiert und vergessen, wie es geht [ich kann nicht scheinen um etwas in den Archiven zu finden]), aber dann habe ich beschlossen, den ASCII- / Unicode-bezogenen Index eines Buchstabens in die Mischung aufzunehmen, da dies ein ziemlich ähnliches Verfahren sein muss.

Ich erinnere mich an etwas wie "\a, um auf das Zeichen a zu verweisen, kann aber nicht funktionieren oder sich genau daran erinnern, wofür es verwendet wird. Ich werde in Kürze Handbücher lesen, aber in der In der Zwischenzeit war es sinnvoll, die Frage zu stellen, da sie möglicherweise schneller ist.

Vielen Dank.

Kommentare

  • Die Syntax lautet <backtick><character>, um den Zeichencode des Letts abzurufen äh. Für den Alphabet-Index können Sie einfach den Index von a (bzw. A) subtrahieren.

Antwort

Das TeXBook sagt:

Eine Zahl in der Sprache von TeX kann mit einem " beginnen. In diesem Fall wird sie als oktal angesehen, oder mit einem ". Wenn es als hexadezimal betrachtet wird, sind \char"142 und \char"62 äquivalent zu \char98.

und

Das Token ` 12 (linkes Anführungszeichen) steht, wenn ein Zeichenzeichen oder ein Kontrollsequenz-Token folgt, dessen Name ein einzelnes Zeichen ist, für den internen Code von TeX der betreffende Charakter. Beispielsweise entsprechen \char`b und \char`\b auch \char98.

Und diese internen Codes lauten (aus Anhang C von The TeXBook ):

Geben Sie hier die Bildbeschreibung ein.

(Oktalzahlen werden kursiv und Hexadezimalzahlen in Schreibmaschinenschrift dargestellt) entspricht der ASCII-Tabelle.

Für TeX gelten also alle 98, "142, "62 und `b sind gültig und repräsentieren dieselbe Nummer .

Das TeXBook zeigt Ihnen auch, was das Primitiv \number bewirkt:

  • \number. Wenn TeX \number erweitert, liest es die folgende Nummer (erweitert Token im Laufe der Zeit); Die endgültige Erweiterung besteht aus der Dezimaldarstellung dieser Zahl, der „-“ vorangestellt ist, wenn sie negativ ist.

Sie können also beide hinzufügen und haben, was Sie wollen! In \number`b liest \number die Nummer `b und erweitert sie auf ihre Dezimaldarstellung 98, der ASCII-Code für b.

Wenn Sie den alphabetischen Index eines solchen Buchstabens möchten, können Sie dies tun wie von Siracusa vorgeschlagen und vom Index von a (oder A, wenn es sich um Großbuchstaben handelt) abgezogen:

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

(Sie müssen 1 hinzufügen, da `a-`a zu Null führen würde). Hier brauchen Sie keine Nummer, da \numexpr bereits weiß, dass `z und `a Zahlen sind Sie benötigen lediglich \the, um \numexpr zu erweitern.

Gleiches gilt für Unicode-Zeichen. \number`₢ (zufällig ausgewählt) gibt 8354 aus. Dies ist die Dezimaldarstellung des Unicode-Punkts U + 20A2. Natürlich benötigen Sie XeTeX oder LuaTeX, um diese zu verwenden.

Kommentare

  • Lobende Erwähnung: \lccode und \uccode.
  • @ bp2017 Nun ja, diese können auch funktionieren. Beachten Sie jedoch, dass Sie \lccode`b=`a dann
    setzen können (sollten aber ' t natürlich nicht) id = „2ea0190dcd“>

    ist 97, nicht 98. Auch \lccode`b ist (normalerweise) gleich \lccode`B, während \number`b und \number`B unterscheiden sich. Auch die \lccode von Nicht-Buchstaben-Zeichen (z. B. \lccode`!) sind Null und nicht der ASCII-Index. Gleiches gilt für \uccode.

  • Es gibt ' auch \@arabic. (Es kann einen Buchstaben als „CHAR“ annehmen und auf eine Ziffer erweitern.)
  • @ bp2017 Ja, da \@arabic{<stuff>} auf \number <stuff>. Und für TeX ‌`CHAR ist ' kein Buchstabe (obwohl er wie einer aussieht), sondern eine Zahl . Das ' ist der Grund, warum \number (und \@arabic) funktioniert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.