Muszę przekonwertować literę na jej indeks w alfabecie oraz na indeks ASCII / Unicode. I chciałbym mieć więcej niż jeden sposób osiągnięcia każdego z przypadków (ponieważ pamiętam, że jest ich więcej niż jeden), jeśli to możliwe.

Najpierw chciałem przekonwertować literę na jej indeks alfabetyczny (pamiętam niektórzy użytkownicy tutaj pokazali mi jak wykonać konwersję jakiś czas temu [na czacie lub w sekcji komentarzy do jednego z pytań], ale nie kopiowałem przykładów i zapomniałem jak to zrobić [Nie wydaje mi się aby znaleźć cokolwiek w archiwach]), ale potem zdecydowałem się dodać indeks litery związany z ASCII / Unicode do miksu, ponieważ musi to być dość podobna procedura.

Przypominam sobie coś takiego jak "\a, aby odwołać się do znaku a , ale nie wydaje się, aby działał ani nie pamiętał dokładnie, do czego jest używany. Wkrótce przeczytam podręczniki, ale w w międzyczasie zadawanie pytania miało sens, ponieważ może być szybsze.

Dziękuję.

Komentarze

  • Składnia jest <backtick><character>, aby uzyskać kod znaku lett er. W przypadku indeksu alfabetu wystarczy odjąć indeks a (lub odpowiednio A).

Odpowiedź

TeXBook mówi:

Liczba w języku TeX może zaczynać się od ", w którym to przypadku jest traktowana jako ósemkowa, lub od ", gdy jest traktowany jako szesnastkowy. Dlatego \char"142 i \char"62 są równoważne z \char98.

i

Token ` 12 (lewy cudzysłów), po którym następuje dowolny token znaku lub dowolny token sekwencji sterującej, którego nazwa jest pojedynczym znakiem, oznacza wewnętrzny kod TeX-a dla postać, o której mowa. Na przykład \char`b i \char`\b są również równoważne z \char98.

A te wewnętrzne kody to (z dodatku C do The TeXBook ):

tutaj wprowadź opis obrazu

(liczby ósemkowe są zapisywane kursywą, a liczby szesnastkowe czcionką do pisania), co odpowiada tabeli ASCII.

W przypadku TeX-a wszystkie 98, "142, "62 i `b są prawidłowe i reprezentują tę samą liczbę .

TeXBook mówi również, co robi prymityw \number:

  • \number. Kiedy TeX rozwija \number, odczytuje następującą po nim liczbę (rozwijając tokeny); końcowe rozwinięcie składa się z dziesiętnej reprezentacji tej liczby, poprzedzonej znakiem „-„, jeśli jest ujemny.

Możesz więc dodać oba i mieć to, co chcesz! W \number`b \number odczytuje liczbę `b i rozwija do jej dziesiętnej reprezentacji, 98, czyli kod ASCII dla b.

Jeśli chcesz mieć alfabetyczny indeks takiej litery, możesz zrobić jak zasugerował siracusa i odejmij od indeksu a (lub A, jeśli masz do czynienia z dużymi literami):

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

(musisz dodać 1, ponieważ `a-`a dałoby zero). Tutaj nie potrzebujesz numeru, ponieważ \numexpr już wie, że `z i `a to liczby ; potrzebujesz tylko \the, aby rozwinąć \numexpr.

To samo dotyczy znaków Unicode. \number`₢ (wybrany losowo) wyświetla 8354, co jest dziesiętną reprezentacją punktu Unicode U + 20A2. Oczywiście potrzebujesz XeTeX lub LuaTeX, aby ich używać.

Komentarze

  • Wyróżnienie: \lccode i \uccode.
  • @ bp2017 Cóż, tak, to też może działać. Pamiętaj jednak, że możesz (ale oczywiście nie ' t) ustawić \lccode`b=`a, a następnie \the\lccode`b będzie równe 97, a nie 98. Ponadto \lccode`b jest (zwykle) równe \lccode`B, podczas gdy \number`b i \number`B są różne. Ponadto \lccode z znaki niebędące literami (na przykład \lccode`!) to zero, a nie indeks ASCII. To samo dotyczy \uccode.
  • Istnieją również ' \@arabic. (Może przyjąć literę, jak `CHAR, i rozwinąć się do cyfry).
  • @ bp2017 Tak, ponieważ \@arabic{<stuff>} rozwija się do \number <stuff>. A dla TeX-a ‌`CHAR to nie ' litera (chociaż wygląda jak jedna), ale cyfra . To ' jest powodem, dla którego \number (i \@arabic) działa.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *