[cstex] Plain-XeTeX: problém s exapanzí \special{}

Petr Tomasek tomasek at etf.cuni.cz
Tue Apr 3 20:14:09 CEST 2018


Dobrý den!

Mám následující problém: Mám rekurzivní makro v plain-XeTeXu (se 
zapnutými e-plain primitivy), kterým se čmárají určité "chlívečky"
kolem textu. Použití je asi toto:

\grp{abcd \grp{def \grp{xyz} \grp{\grp{qwert} \grp{qwertz}}}}

Rád bych uvnitř tohoto makra označil některá slova barevně, tj. něco jako:

\def\wrd#1{\special{pdf:bcolor [0.8 0.2 0.2]}#1\special{pdf:ecolor}}

Tedy například:

\grp{abcd \grp{def \wrd{ghjk} lopk} asdf \wrd{zzz}}

To mi ale nefunguje. Problém je zřejmě v tom, že v rámci makra \grp si potřebuju
nejdřív změřit, kolik daný blok měří, tj. používám \setbox0 a potom zase \box0.
To asi znamená, že se \special{}, jestli tomu dobře rozumím, spustí již ve chívli
kompletování jednotlivých boxů, a tedy se do PDF uloží na naprsto nesmyslém místě.
(TeX potom zahlásí do terminálu: "** WARNING ** Color stack underflow. Just ignore.")

Snažil jsem se TeX přinutit, aby pozdržel expanzi, až bude vše hotovo, ale nepodařilo se
mi to. Skoušel jsem dát přímo do makra \let\wrd=\relax%, ale to pak nedělá nic,
snažil jsem makro definovat až v \output routine, ale taky bez úspěchu.

Můžete mě, prosím, nasměrovat, dál? Zkoušel jsem hledat ve všech třech knihách pana Olšáka,
co má na internetu, ale bohužel bez úspěchu.

(Prosím, žádná řešení pro LaTeX ani jiné podobné nadstavby...)

Děkuji

P.T.


\grp makro vypadá takto:

% ===================== ramecky makra ==============================
%
% Pomocne makro: v kazde urovni predefinovat barvu...
\def\redefcolors#1|#2>{\def\onecolor{#1}\def\hanalcolors{#2>}}
\def\hanalcolors{.7 .1 .1|0.07 .7 .1|.8 .6 .1|.4 0 .5|.55 .5 .5|0 .7 .6|.9 .5 .2|0 0 0|0.07 .7 .1|.8 .6 .1|.4 0 .5|.55 .5 .5|0 .7 .6|.9 .5 .2|0 0 0|0 0 0|0 0 0|0 0 0|0 0 0|0 0 0|0 0 0|1 1 1>}
\def\color#1#2{\special{pdf:bcolor #1}#2\special{pdf:ecolor}}
\raggedbottom
\newdimen\hanalskip%
\newdimen\hanalrule%
\hanalskip=5.5pt%
\hanalrule=.55pt%
%
% :::::::: hlavni makro :::::::::::::::;
\def\grp#1{%
\begingroup%
% ---------------- nastavit barvu (\onecolor) pro tuto uroven...
\expandafter\redefcolors\hanalcolors% BACHA: musi byt pred \setbox0 !!!
% ---------------- vypocty velikosti mezer etc...
\setbox0=\hbox{#1}%
% \dimen0 = \dp0 + \hanalskip + \hanalrule
\dimen0=\dp0\advance\dimen0 by\hanalskip\advance\dimen0 by\hanalrule%
% \dimen1 = 4/5 * \hanalskip
\dimen1=\hanalskip\multiply\dimen1 by 4\divide\dimen1 by 5%
% ---------------- vocasek pred
\lower\the\dimen0\vbox{%
\color{[\onecolor]}{\hbox to \hanalrule{\vrule depth0pt height\dimen1 width\hanalrule}}\vfil}%
% ---------------- vbox: text + linka pod
\lower\the\dimen0\vbox{%
\box0%
\vskip\hanalskip%
\color{[\onecolor]}{\hrule height\hanalrule depth0pt}%
}%
% ---------------- vocasek za
\lower\the\dimen0\vbox{%
\color{[\onecolor]}{\hbox to \hanalrule{\vrule depth0pt height\dimen1 width\hanalrule}}\vfil}%
%
\endgroup%
}




More information about the csTeX mailing list