Str (cislo -> znak)
Hans Ginzel
hans at kolej.mff.cuni.cz
Sat Sep 30 13:06:46 CEST 2000
Dobrý den.
On Fri, Jul 14, 2000 at 01:51:04PM +0200, Zdenek Wagner - Ustav chemickych procesu AV wrote:
>
> > > \newtoks\mytoks \newcount\mycount
> > > \mycount=65
> > > %% \cosi ???
> > \mytoks={\char\the\mycount}
>
> Pri vkladani do token-registru nedochazi k expanzi a \char je primitiv,
> takze se nebude expandovat ani v \edef. Je nutno pouzit napr.:
>
> \mytoks\expandafter{\char\the\mycount}
Jak sám píšete, \char je primitiv, takže \expandafter { \char
se chová stejně, jako kdyby tam \expandafter nebylo.
Ani
\mytoks \expandafter {\expandafter \char \the\mycount}
neřeší požadované -- výsledek je expandování \the\mycount na 65 a
přiřazení \char 65 do tokenregistru.
> (nebo mozna \number\mycount, nejsem si uplne jist, zda \the\mycount vrati
> presne to, co ocekava \char). Pouziti v \edef by vyzadovalo 3
> \expandafter (a stejne by to fungovalo i v \def).
Primitivy \the a \number expandují shodně pro registr typu count. Za
\the má být <internal quality> (registr, ale i třeba \%), za \number se
tokeny expandují podle syntaktické pravidla <number>, což může být také
registr, ale jen numerického typu -- number, dimen, glue, a to ještě
dojde ke konverzi dimen a glue na number:
\the 25 % error
\number - ++ -- 25 % -25
\the \% % 37, protože v plain.tex \chardef\%=`\%
\the `\% % error
\number `\% % 37
\the\parindent % 20.0pt (plain.tex)
\number\parindent % 1310720 (po konverzi)
\the\interdisplaylinepenalty % 100 (plain.tex)
\number\interdisplaylinepenalty % 100
\the\output % \plainoutput
Primitiv \char očekává <number>.
Pokud tedy chci převod na úrovni expandprocessoru, nezbývá mi než si
vyrobit konverzní tabulku pomocí \csname a \endcsname:
% \chr:32 -> \ %
% \chr:33 -> !
% \chr:34 -> "
% \chr:35 -> \#
\newcount\tempno \tempno=31
\def\next#1{\ifx#1\relax \let\next=\relax \else \advance\tempno by 1
\expandafter \def \csname chr:\the\tempno \endcsname{#1}\fi \next}
\next % defines the ascii table for \chr (32 -- 126)
\ ! " \# \$ \% \& ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] \^ \_ `
a b c d e f g h i j k l m n o p q r s t u v w x y z \{ | \} \~ \relax%
Pak můžu pro převod definovat:
\def\ord#1{\number`#1}
\def\chr#1{\csname chr:#1\endcsname}
a přiřadit
\mytoks\expandafter{\csname chr:\the\mycount\endcsname}
Pro užší výseč by se nechalo použít \ifcase#1 \or \or ...\fi.
Zdraví
Hans Ginzel
More information about the csTeX
mailing list