[cstex] Plainovska makra s ConTeXtem - vyreseno

Jaroslav Hajtmar hajtmar at gyza.cz
Fri Mar 16 14:58:50 CET 2007


Dobry den.

Mnohokrat dekuji panu Marikovi a panu Olsakovi, kterym se podarilo 
vyresit muj problem ....

Presne jak psal pan Marik - ConTeXt asi opravdu predefinovava \input. 
Kdyz jsem totiz ve zminenem makru - aplikaci scancsv.tex zmenil prikaz 
\input na \normalinput (jak radil pan Marik) a zkopiroval do sveho 
zdrojaku plainovske makro \dospecials ze souboru plain.tex (jak radil 
pan Olsak), tak aplikace zacala fungovat!


Muj zaver :

Puvodni (naprosto nezmenena) aplikace, tak jak byla napsana panem 
Olsakem funguje, pokud se do vaseho zdroje dodefinuje plainovske makro 
\dospecials, ktere ConTeXt nezna a dale se provede substituce 
\let\input=\normalinput.

Makro \dospecials je nadefinovano v souboru plain.tex takto :

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

Abych nemusel menit puvodni aplikaci pana Olsaka, udelal jsem nakonec 
misto nahrazeni prikazu \input prikazem \normalinput substituci 
\let\input=\normalinput, ktera zaruci funkcnost aplikace, nactene 
inputem do ConTeXtu. Minimalni zdrojak tedy dle mne muze vypadat napr. 
takto:

\setupoutput[pdftex]
\enableregime[cp1250]
\mainlanguage[cz]

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

\let\input=\normalinput
\input scancsv

\def\printaction{\e[porcis]. \e[jmeno],  \e[adresa] \page}

\def\lineaction{\printaction}


\starttext
\scanbase zamestnanci.csv
\stoptext


pricemz prvnich par radku  souboru  zamestnanci.csv vypada napr. takto :

porcis;jmeno;adresa
1;Bartoň Jan;Polní 20, 789 01 Zábřeh
2;Bíla Věra;Kosov 23, 789 01 Zábřeh
3;Boková Helena;Starobranská 34/345, 111 50 Praha 
4;Brožová Marie;U Dráhy 34, 234 56 Zvole


Zatim jsem narazil jen jediny problem ... pri dosazeni strankoveho zlomu 
se uplne vlevo dole na uplnem okraji stranky (vlastne mimo tisknutelnou 
oblast) objevi (pouze na prvni strance!) pet nul tj. 00000 .... vypada, 
ze  nekde neco utika do vystupu ... ale nevim co by to mohlo byt, 
protoze naprosto stejny zdrojak (upraveny pro plain) zkompilovany v 
pdfplainu nic podobneho nedela... (ze by predefinice \input na 
\normalinput???)

Jinak pro zajemce o tuto (databazovou) problematiku v ConTeXtu jsem se 
na zaklade rady pana Kuly trochu zajimal o reseni vyhradne cestou ConTeXtu.
Reseni existuje docela jednoduche, nicmene i presto se mi libi vice 
reseni pana Olsaka. Jeho reseni totiz respektuje to, ze nazvy poli jsou 
primo umisteny v CSV souboru a pomoci nazvu poli se da na ne primo 
odvolavat (makrem \e[nazevpole] ). V ConTeXtu je nutne pouzivat 
promennych #1 - #9, coz omezuje pocet poli se kterymi se da pracovat (i 
kdyz pan Olsak v TBN popisuje jak se da pocet parametru zvetsit) a navic 
si clovek musi porad pamatovat poradi parametru a pokud se zmeni 
struktura SCV souboru tak je to vsechno v pytli, protoze se to cele pak 
rozhodi... Pokud by nekdo snad vedel jak by se to dalo udelat jinak tak 
budu moc rad, kdyz se ozvete. Zatim predkladam ConTeXtovske reseni jak 
jsem jej ziskal experimentovanim :

\setupoutput[pdftex]
\enableregime[cp1250]
\mainlanguage[cz]
\usemodule[database]

\def\MujDopis#1#2#3#4#5#6#7{
{\bf Oznámení výsledků zkoušky : }\crlf
Jméno : #2\crlf
Bydliště : #4\crlf

Vážen#6 pan#7 {\bf #3}, zdravím Vás a posílám Vaše výsledky.

Počet získaných bodů {\bf #5}\par
Pořadí : #1\par

\hfill S úctou Váš {\it Oldřich Skočdopole}\break 
\page}

\defineseparatedlist[MujPokus][separator={;},
                                                            
before=\bTABLE,after=\eTABLE,
                                                            
first=\bTR,last=\eTR,
                                                            
left=\bTD,right=\eTD,command=\MujDopis]

\starttext

Jeden způsob použití :

\startMujPokus
1.;Bartoň Jan; Jane Bartoni; Polní 20, 789 01 Zábřeh;34;ý;e
2.;Bíla Věra;Věro Bílá; Kosov 23, 789 01 Zábřeh;32;á;í
3.;Boková Helena;Heleno Boková;Starobranská 34/345, 111 50 Praha;25;á;í 
4.;Brožová Marie;Marie Brožová;U Dráhy 34, 234 56 Zvole;12;á;í
\stopMujPokus


Druhý způsob použití - z externího souboru :

\processseparatedfile[MujPokus][zamestnanci1.csv]
% struktura a obsah souboru zamestnanci1.csv je stejny jako o par radku 
vyse 
% mezi \startMujPokus a \stopMujPokus

\stoptext


Pokud odstranite z makra \defineseparatedlist posledni parametr ...
tj. ,command=\MujDopis tak se misto zneni dopisu vytiskne oramovana 
kompletni
tabulka se vsemi daty. Pouziti parametru command=\prikaz  je docela 
vyvedena vychytavka, nebot se timto zpusobem da definovat nekolik 
ruznych zobrazeni dat ConTeXtem ze stejnych databazovych udaju.

BTW: jinak mi pripada, ze se autor reseni v ConTeXtu bud inspiroval 
aplikaci pana Olsaka nebo hodne podobne reseni vychazi z podstaty veci...

Jinak pro uplnost - aplikace scancsv.tex, kterou vytvoril pan Olsak ze 
sve puvodni aplikace scanbase.tex (ktere resi stejnym zpusobem 
zpracovani dat Plainem z napr. MySQL databaze - tj ze souboru, ktery ma 
strukturu :

%  +------------+------------+----------------------------+
%  |   zahlavi1 |   zahlavi2 |  zahlavi3 ...              |
%  +------------+------------+----------------------------+
%  |   text 1,1 |   text 1,2 |  text 1,3 ...              |
%  |   text 2,1 |   text 2,2 |  text 2,3 ...              |
%  |   text 3,1 |   text 3,2 |  text 3,3 ...              |
%  |   ...      |   ...      |           ...              |
%  +------------+------------+----------------------------+
%

Myslim ze se to muze nekomu hodit ... Me se to bohuzel nehodilo, protoze 
mi zadny z poskytovatelu neposkytuje primy pristup do MySQL databaze 
(jen prostrednictvim phpMySQLAdmina). Proto jsem pozadal pana Olsaka, 
aby modifikoval svoji aplikaci na zpracovani obecnejsiho tvaru dat tj. :

%  "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"
%  ...

Uzivatel muze navic po nacteni \input scancsv predefinovat makra \separator
a \obklopeni, pokud jsou v datech polozky a zahlavi oddeleny jinymi 
znaky nez strednik a symbol uvozovek.

Tim je makro natolik obecne, ze se urcit bude hodit i  nekomu  jinemu 
... notabene kdyz  nyni funguje i v ConTeXtu... :-)
 
Vsechny zdravim a  mnohokrat dekuji vsem za napady, rady a inspiraci - 
obzvlaste panum Marikovi a Olsakovi za pomoc pri reseni meho problemu ...

Pekny den preje Jarda Hajtmar
 
PS: Pokud by snad nekoho napadlo, proc se dole objevuji ty 00000 .. tak 
dejte vedet - s tim si nevim rady.
 



Robert Marik napsal(a):
> Sice context nepouzivam, ale po par pokusech to vypada ze je 
> predefinovana sekvence \input.
>
> zkuste v makru \scanbase v souboru scancsv.tex opravit \input na 
> \normalinput
>
> minimalne to odstrani chybovou hlasku, jestli se to chova tak jak 
> potrebujete, to netusim.
>
> robert marik
>
> Petr Olsak wrote:
>   
>> On Thu, 15 Mar 2007, Jano Kula wrote:
>>
>>     
>>> Dobrý den!
>>>
>>> Jaroslav Hajtmar wrote:
>>>       
>>>> Dobry den.
>>>> Potreboval bych zjistit do jake miry je ConTeXt "tolerantni" k externim
>>>> plainovskym makrum (nacitanym pomoci \input). Predpokladam, ze to asi
>>>> neni z hlediska ConTeXtu prilis zadouci, nicmene  presto by mi to moc
>>>> pomohlo. Zkousel jsem neco delat - jednoducha makra ConTeXt
>>>> "zchroustne", ale pri pouziti slozitejsich maker mi ConTeXt neustale
>>>> hlasi nejake chyby. Muzete mi prosim poradit na co je treba si dat pozor
>>>> pripadne v cem muze byt problem pri pouzivani plainovskych maker s
>>>> ConTeXtem?
>>>>         
>>> Není to odpověď na otázku, ale ...
>>>       
>> Dobrý den,
>>
>> obávám se, že zatím žádný z přispěvatelů neodpověděl na otázku. Odpověď by
>> přitom zajímala i mě.
>>
>> Domnívám se, že šlo o to, aby někdo, kdo má instalovaný ConTeXt (což já
>> nejsem) a rozumí TeXu si například zmíněné makro vyzkoušel a popsal, kde
>> vězí problém. Nebo odkázal na dokument, kde jsou popsány odlišnosti mezi
>> ConTeXtem a plainem, ze kterých by jednoznačně vyplynulo, jak obtížné by
>> bylo plainovské makro pro použití v ConTeXtu předělávat. Z mého pohledu
>> nejde ani tak o toto konkrétní makro (o tuto konkrétní aplikaci), ale o
>> obecný problém "vzdálenosti" mezi ConTeXtem a plainem a možnosti adaptovat
>> věci, které v plainu běží, do ConTeXtu.
>>
>> Je zřejmé, že odpovědi typu "použijte jiný nástroj na řešení Vašeho
>> konkrétního problému" mě osobně neuspokojily.
>>
>> Zdravím
>>
>> Petr Olšák
>>
>>
>>
>> _______________________________________________
>> csTeX mailing list
>> csTeX at cs.felk.cvut.cz
>> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>>
>>     
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>
>
>
>   




More information about the csTeX mailing list