Prohazovani pismen v TeXu

Petr Olsak olsak at math.feld.cvut.cz
Fri May 27 07:21:54 CEST 1994


Vazeni TeXovi pratele, dobry den.

Zaujal me dotaz pana Skody na prohazovani pismen, zvlaste, kdyz je zde
treba s \catcody manipulovat mimoradne opatrne. Nevymyslel jem nic jineho,
nez se objevilo v predchazejicich odpovedich--taky jsem zaktivnil pismena.

Pokusil jsem se ale najit relativne univerzalni reseni, kde uzivatel makra
napise celkem prehledne tabulku zmen jakychkoli pismen (viz v prikladu
text mezi \defchanges a \enddefchanges), pricemz se nemusi starat
o \catcody, o poradi zanesenych zmen apod.

Nasledujici ukazku muzete rovnou zkusit zpracovat v plainu a po trivialnich
upravach (doplneni \documentstyle a dalsich kecu) by mela bezet i v LaTeXu.

---------------------- plain TeX file ----------------------------------

% Makra na prekodovani textu (pouziti - viz nize)
% 26.5.94                              Petr Olsak
\newwrite\workout \immediate\openout\workout=\jobname.cod
\def\allactives{}
\def\defchanges{\bgroup
   \def~##1-##2{\immediate\write\workout{{\string\redef\space##1##1{##2}}}}}
\def\enddefchanges{\immediate\closeout\workout
   \def\redef##1{\catcode`##1=13 \xdef\allactives{\allactives##1} \gdef}
   \input \jobname.cod
   \egroup}
\def\setactive#1{\if#1;\let\setactive=\relax\else\catcode`#1=13\fi\setactive}
\def\encoded{\expandafter\setactive\allactives;}
%%%%%%%%%%%%%%%%%%  Konec maker %%%%%%%%%%%%%%%%%%

\defchanges
  ~i-C  ~a-l  ~l-a   ~s-c  ~c-s  % tabulka zmen, napr. pisu i, tiskne se C
\enddefchanges

Tady je normalni text.
{\encoded Tady je zmena v~pismenech. Bla bla bla.}
A tady je text normalni.

Pozor! Uvnitr pusobeni prikazu {\encoded tj. tady}, nelze pouzit
vicepismenove kontrolni sekvence obsahujici pismeno, ktere menime. V~nasem
priklade treba prikaz {\it}. Je potreba definovat jednopismenny prikaz, napr:
  \let\i=\it
vne kodovaneho textu a pak psat: {\encoded toto je psano {\i italikem\/}}.

\end

----------------------- end of plain TeX file -----------------------------

Pro ty, kteri chteji me makro precist:

Neprisel jsem na to, jak zaridit sejmuti parametru, ucineni jej aktivnim a
ihned jeho definovani, aniz by parametr nemusel byt ze vstupniho souboru
cten dvakrat. Konstrukci
  \def\redef#1{\catcode`#1=13 \gdef#1{...}}
nelze pouzit, protoze jakmile je jednou parametr sejmut, je tokenizovan a
zmena \catcodu zpusobi toliko zmenu budouci tokenizace. Spravne tedy
funguje:
  \def\redef#1{\catcode`#1=13 \gdef}
pricemz je nutno pouzit prikaz \redef se dvema za sebou jdoucimi stejnymi
parametry takto:
  \redef dd{novy vyznam}
Zde se definuje d a nikoli dd. Navic je mozno bez zabran ucinit pismeno d
aktivnim, protoze sekvence \gdef uz byla tokenizovana drive.

Chtit na uzivateli makra, ktery pise tabulku zmen, aby psal vychozi pismeno
vzdy dvakrat, mi pripadalo nekulturni. Proto jsem pouzil pracovni soubor
\jobname.cod, kam jsem tyto \redef postupne sestavil a tento soubor jsem pak
nacetl prikazem \input.

Znak neni mozno nechat dele aktivni, nez pro okamzik definice, nebot
v dalsi definici se muze uz vyskytnout na prave strane definice.
(viz ~a-l ~l-a). Proto jsou obaleny vsechny \redef dvojici { }.
Nadefinovane znaky se kumuluji v makru \allactives, takze makro \setactive
vsechny nadefinovane znaky v pripade potreby znovu zaktivni.

Ma-li byt na prave strane \redef vice nez jeden znak, dokonce mezi nimi
znak zrovna aktivovany, musi se pouzit \char`\z  (kde z je znak).
Jedna-li se navic o znak nalezajici se ve slove char, je nutne psat nejprve
\let\?=\char a byt obezretny. Tuto vec jsem do makra nezahrnul, protoze
nebyla v uloze pana Skody formulovana.

Petr Olsak



More information about the csTeX mailing list