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