Potřebuji převést písmeno na jeho index v abecedě a na jeho index ASCII / Unicode. A chtěl bych mít více než jeden způsob, jak dosáhnout každého z těchto případů (protože si pamatuji, že jich je více než jeden), pokud je to možné.
Nejprve jsem chtěl převést písmeno na jeho abecední index (pamatuji si někteří uživatelé mi před chvílí ukázali, jak provést konverzi [buď v chatu nebo v sekci komentářů k jedné z otázek], ale nekopíroval jsem příklady a zapomněl jsem, jak to udělat najít něco v archivech]), ale pak jsem se rozhodl přidat do mixu index ASCII / Unicode dopisu, protože to musí být docela podobný postup.
Vzpomínám si na něco jako "\a
odkazovat na znak a , ale zdá se, že to nefunguje, nebo si přesně pamatovat, k čemu se používá. Příručky budu číst brzy, ale v mezitím mělo smysl položit otázku, protože může být rychlejší.
Děkuji.
Komentáře
Odpověď
TeXBook říká:
Číslo v jazyce TeXu může začínat
"
, v takovém případě je považováno za osmičkové, nebo"
, když je považován za hexadecimální.\char"142
a\char"62
jsou tedy ekvivalentní\char98
.
a
Token
`
12 (levá citace), následuje-li jakýkoli znakový token nebo jakýkoli token řídicí sekvence, jehož název je jeden znak, znamená vnitřní kód TeXu pro dotyčná postava. Například\char`b
a\char`\b
jsou také ekvivalentní s\char98
.
A tyto interní kódy jsou (z přílohy C TeXBook ):
(osmičková čísla jsou uvedena kurzívou a hexadecimální čísla v písmu psacího stroje), která je stejná jako tabulka ASCII.
Takže pro TeX všechny 98
, "142
, "62
a `b
jsou platné a představují stejné číslo .
TeXBook vám také řekne, co primitiv \number
dělá:
\number
. Když TeX expanduje\number
, přečte následující číslo (rozšiřuje tokeny, jak to jde); konečná expanze se skládá z desetinného vyjádření tohoto čísla, před kterým je „-
“ pokud je negativní.
Takže můžete přidat obojí a mít, co chcete! V \number`b
přečte \number
číslo `b
a rozšíří se na desítkové vyjádření, 98
, což je kód ASCII pro b
.
Pokud chcete abecední rejstřík takového písmene, můžete tak učinit jak navrhl siracusa a odečtěte od indexu a
(nebo A
, pokud se jedná o velká písmena):
\the\numexpr`z-`a+1\relax % prints 26
(musíte přidat 1, protože `a-`a
by vedl k nule). Zde číslo nepotřebujete, protože \numexpr
již ví, že `z
a `a
jsou čísla ; stačí \the
rozbalit \numexpr
.
Totéž platí pro znaky Unicode. \number`₢
(vybráno náhodně) vytiskne 8354, což je desítkové vyjádření bodu Unicode U + 20A2. K jejich použití samozřejmě potřebujete XeTeX nebo LuaTeX.
Komentáře
- Čestné uznání:
\lccode
a\uccode
. - @ bp2017 Ano, i ty mohou fungovat. Mějte však na paměti, že můžete (ale samozřejmě ' t) nastavit
\lccode`b=`a
, pak\the\lccode`b
bude 97, ne 98. Také\lccode`b
je (obvykle) stejný\lccode`B
, zatímco\number`b
a\number`B
se liší. Také\lccode
znaky bez písmen (například\lccode`!
) jsou nula, nikoli index ASCII. Totéž platí pro\uccode
. - Existuje ' s také
\@arabic
. (Může trvat písmeno, jako `CHAR, a expandovat na číslici.) - @ bp2017 Ano, protože
\@arabic{<stuff>}
se rozšiřuje na\number <stuff>
. A pro TeX`CHAR
není ' písmeno (i když to vypadá jako jedno), ale číslo . To ' proč\number
(a\@arabic
) funguje.
<backtick><character>
získat kód postavy lett ehm. U indexu abecedy stačí odečíst indexa
(neboA
).