[cstex] Plainovska makra s ConTeXtem ??

Jaroslav Hajtmar hajtmar at gyza.cz
Thu Mar 15 07:15:14 CET 2007


Diky za odpoved.
Zkusil jsem v makru, ktere pouzivam prejmenovat co se da ... bohuzel bez 
valneho vysledku.

Hlavni problem je v tom, ze se jedna o makro, ktere neni me vlastni - 
napsal jej pan Olsak a urcite neni pro mne elementarni jej pochopit. Tim 
chci naznacit, ze pouzivam uz asi dva roky v plainu "blackbox" 
scancsv.tex pana Olsaka v plainu k me naramne spokojenosti.

BTW: Myslim, ze v dnesni dobe pouzivani Excelovskych tabulek s daty je 
prave makro scancsv.tex pana Olsaka to prave, co umoznuje delat v plainu 
jakysi "mailmerge". V plainu jsem s timto makrem udelal uz velkou 
spoustu veci a bezne pomoci nej resim napr. hromadnou korespondenci pri 
prijimacich zkouskach a ruznych testech atd. Uvadim to jen proto, abych 
mu udelal dobrou reklamu a nalakal pripadne zajemce o tuto zalezitost :-).
Zajemci si mohou toto makro stahnout z ftp serveru pana Olsaka 
ftp://math.feld.cvut.cz/pub/olsak/makra/ .

Ja mam v teto chvili eminentni zajem zkusit pouzivat ConTeXt (vzhledem k 
jeho formatovacim schopnostem) prave s timto makrem, coz by mi dalo do 
rukou neskutecne mocny nastroj (i kdyz pro mne bohuzel porad jeste 
blackbox).

Bohuzel makro scancsv.tex ve spojeni s ConTeXtem bohuzel nefunguje. Pan 
Olsak mi uz soukrome poradil a tim pomohl odhalit prvni problem tj. ze 
jeho makro vola plainovske makro \dospecials, ktere ConTeXt nezna. 
Poradil mi prevzit definici makra \dospecials ze souboru plain.tex. Tam 
je makro \dospecials definovano takto :

\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}

Pote co jsem to udelal, tak se chybova hlaska zmenila na jinou hlasku :

! Missing \endcsname inserted.
<to be read again>
\relax
\runheader ...xpandafter \ifx \csname e:\itemdata
\endcsname \relax \expanda...

\scanfirstline #1^^X->\scanheader #1;
^^X
\scanbase ...r \scanfirstline \input #1 \relax ^^X
\endhook \endgroup
l.19 \scanbase zamestnanci.csv^^M

?

Cele makro pana Olsaka je asi na 150 radcich a nechci ho posilat (viz. 
ftp://math.feld.cvut.cz/pub/olsak/makra/), ale pokud by nekdo byl 
ochoten se tim zabyvat a navic byl schopen pochopit z hlasky v cem je 
problem, posilam svuj ConTeXtovy osekany zdrojak, cast makra ve ktere 
asi dojde k chybe a pak popis funkce makra, tak jak to popisuje pan 
Olsak. Moc by mi pomohlo, kdyby se nekomu podarilo prijit na to, v cem 
je jadro pudla.

Mnohokrat dekuji za pripadne rady a omlouvam se za asi dost specificky 
dotaz.
S pozdravem Jaroslav Hajtmar


Nasleduji popisovane prilohy:

% Muj zdrojak :
\setupoutput[pdftex] % Určuje výstup ConTeXtu.
\enableregime[cp1250] % Kódování.
\mainlanguage[cz] % Podle typografických pravidel

\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
\do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}

\input scancsv
\def\printaction{\e[jmeno]}
\def\lineaction{\printaction}
\starttext
\scanbase zamestnanci.csv
\stoptext

% obsah souboru zamestnanci.csv (oddelovac pro csv je strednik ):
pc;jmeno
1.;Barton Jan
2.;Bila Vera
3.;Bokova Helena
4.;Brozova Marie



% nasleduje cast makra pana Olsaka :

\def\scanbase #1 {\begingroup \endlinechar=`\^^X
\edef\maskauvo{\obklopeni####1\obklopeni\separator}
\edef\maskaneuvo{####1\separator}
\expandafter\def \expandafter\maskheader \maskauvo 
{\def\itemdata{##1}\runheader}
\expandafter\def \expandafter\nomaskheader \maskaneuvo 
{\def\itemdata{##1}\runheader}
\expandafter\def \expandafter\maskitem \maskauvo 
{\def\itemdata{##1}\runitem}
\expandafter\def \expandafter\nomaskitem \maskaneuvo 
{\def\itemdata{##1}\runitem}
\edef\scanfirstline ##1^^X{\noexpand\scanheader##1\separator\noexpand^^X}
\def\do##1{\catcode`##1=12 }\dospecials
\catcode`\ =10 \beginhook
\expandafter \scanfirstline \input #1 \relax^^X\endhook \endgroup}


% a konecne popis funkce makra :

% scancsv. tex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 26. 2. 2005 Petr Olsak

% Makro na zpracovani databasovych vystupu ve formatu CSV pro plain.
%
% Srovnejte tez makro scanbase.tex
%
% Nacitane soubory se predpokladaji ve tvaru:
%
% "zahlavi1";"zahlavi2";"zahlavi3"; ... "zahlavi-n"
% "text 1,1";"text 1,2";"text 1,3"; ... "text 1,n"
% "text 2,1";"text 2,2";"text 2,3"; ... "text 2,n"
% "text 3,1";"text 3,2";"text 3,3"; ... "text 3,n"
% ...
%
% Na takovy soubor je mozno po
%
% \input scancsv.tex
%
% aplikovat makro \scanbase takto:
%
% \scanbase soubor
%
% Obklopujici znak " muze u libovolneho zahlavi nebo polozky
% chybet. Tj. je korektni treba i takovy zapis dat:
%
% "jmeno";"prijmeni";cislo;RC
% "Ferdinand";"Mravenec";1;000111/2244
% "Josef";"Vykutal";2;444333/2211
%
% Makro nacte zahlavi a zacne cist jednotlive radky. Po precteni
% kazdeho radku je obsah polozky pripraven v expanznim makru
% \e. Presneji \e[zahlavi] expanduje na text odpovidajici polozky.
% V teto situaci \scanbase spusti makro \lineaction, ktere si muze
% uzivatel definovat jak chce.
%
% Po ukonceni makra \lineaction cte scanbase dalsi radek tabulky, naplni
% znovu expanzni makra \e texty polozek z tohoto radku a spusti znovu
% \lineaction. To se opakuje tak dlouho, dokud neni ukonceno cteni
% tabulky. Navic je makru \lineaction k dispozici registr \numline
% obsahujici cislo prave precteneho radku.
%
% Priklad pouziti:
%
% \input scancsv
%
% \newcount \mylines
% \def\bb #1 #2/{\hbox to#1{#2\hss}}
%
% \def\printaction{\global\advance\mylines by1 %% \scanabase pracuje
% \hbox{% %% uvnitr skupiny!
% \bb 2em \the\numline./
% \bb 26em \e[nazev]/
% \bb 10em \e[prijmeni] \e[jmeno]/
% \bb 3em \hfill\e[kc2002]/
% \bb 3em \hfill\e[kc2001]/}
% }
% \def\lineaction{\if K\e[typ_clenstvi]% Kolektivni clenove
% \printaction
% \else \if G\e[typ_clenstvi]% Gymnazia
% \printaction
% \fi\fi % tisknu jen kolektivni cleny a gymnazia
% }
% \scanbase database1
% \scanbase database2
% {\it Number of printed lines: \the\mylines}.
% \end
%
% Pokud neni uzivatelem definovano makro \lineaction, pouzije
% scanbase sve vlastni (defaultni) makro, ktere vytiskne vsechny polozky
% jednoho radku do odstavce ve velmi zhustenem tvaru (vyzkousejte si).
%
% Kazde \scanbase vstupuje do skupiny, pak spusti \beginhook,
% pak cte hlavicku a jednotlive radky, jak bylo receno vyse,
% pak spusti \endhook a nakonec vyleze ze skupiny.
% Sekvence \beginhook a \endhook muze predefinovat uzivatel, defaltne maji
% hodnotu \relax
%
% Uzivatel muze po nacteni \input scanbase predefinovat makra \separator
% a \obklopeni (viz nize), pokud jsou v datech polozky a zahlavi
% oddeleny jinymi znaky nez strednik a symbol palce.





Josef Polách napsal(a):
> Jaroslav Hajtmar napsal(a):
>   
>> Potreboval bych zjistit do jake miry je ConTeXt "tolerantni" k externim 
>> plainovskym makrum (nacitanym pomoci \input). Predpokladam, ze to asi 
>>     
>
> Ani tady zr(ejme( nezáleží, jsou-li makra nac(ítána jako input 
> nebo umíste(na ve stejném souboru jako ostatní zdroj.
>
>   
>> "zchroustne", ale pri pouziti slozitejsich maker mi ConTeXt neustale 
>> hlasi nejake chyby. Muzete mi prosim poradit na co je treba si dat pozor 
>>     
>
> Jaké chyby? Podle chybových hlášek by se to me(lo dát poznat.
>
>   
>> pripadne v cem muze byt problem pri pouzivani plainovskych maker s 
>> ConTeXtem?
>>     
>
> Možná v robustnosti/kr(ehkosti. Ale zatím ConTeXt moc neznám. 
> Napadá me( po zkušenostech s LaTeXem: Nepojmenovávat svá 
> makra stejne(, jako existující ConTeXtová, mohl by vypuknout 
> zmatek a pr(ekvapení. Taky je potr(eba ohlídat si registry, co 
> se kam ukládá... Každá pr(edpr(ipravená nadstavba skýtá 
> nepohodlnost vlastních úprav.
>
>   
>> Diky. Jarda Hajtmar
>>     
>
> Za nepatrne( málo. Patr(í se hrabat v te(ch chybových hláškách. 
> Tr(eba více napoví ostatní...
>
> Pohoda, hezký den
>
>   
>
>   




More information about the csTeX mailing list