[cstex] Vyplnění dokumentu údaji z databáze (hromadná korespondence)

Zdenek Wagner zdenek.wagner at gmail.com
Wed Jul 16 13:55:28 CEST 2008


2008/7/16 "Procházka Lukáš Ing. - Pontex s. r. o." <LPr at pontex.cz>:
> Dobrý den,
>
> řeším specifický problém.
>
> Mám dopis napsaný v LaTeXu. V něm jsou čtyři pole, která se mají měnit
> (říkejme jim např. PAR1, PAR2, PAR3 a PAR4).
>
> Vedle toho mám textový dokument jako databázi, kde každý řádek obsahuje tyto
> čtyři parametry na jednom řádku oddělené oddělovačem (předpokládejme
> středník). Řádků v databázi je cca 600.
>
> A potřebuji tyto hodnoty postupně (po řádcích) načítat, nahrazovat jimi
> parametry PAR1-4 (resp. dosazovat za tyto parametry) a .texový dokument
> zkompilovat do .pdf. Mělo by tak vzniknout cca souborů .pdf. (Nebo může
> vzniknout jeden 600stánkový dokument, to je také řešení.)
>
> Pro dokreslení skutečnosti - jde o dopis, ve kterém jsou parametricky
> zadávány adresy a další, tj. parametry představují jméno, adresu, kontaktní
> telefon a nějaké další údaje.
>
> Nejsem TeXovsky zdatný programátor - zvládnu pouze primitivní jednořádkové
> příkazy bez cyklů a podmínek - proto budu vděčen za každý námět, jak tuto
> hromadnou korespondenci vyřešit.
>
> Požívám TL2007 pod WinXP.
>
Nejprve si připravte definici makra, kde budou parametry odděleny
příslušným oddělovačem (např. středníkem):

\def\precti#1;#2;#3;#4;{... definice ...}

Makro \precti uvidí 4 parametry označené klasicky #1, #2, #3, #4,
takže s nimi můžete běžně pracovat. Nyní si otevřete vstupní soubor:

\newread\vstup % rezervujeme si identifikátor
\openin\vstup jmeno.souboru

Řádek nacteme do řídící sekvence \radek příkazem

\read\vstup to \radek

Obsah makra \radek nyní musíme dostat jako parametr makra \precti, tj.
musí být expandován dříve. Navíc asi není středník na konci řádky,
musíme jej tedy doplnit při volání makra. Příkaz tedy bude vypadat:

\expandafter\precti\radek;

Konec souboru otestujeme příkazem \ifeof\vstup a vše vložíme do \loop.
Makro \loop ale požaduje \if bez \else, jenže \ifeof vrací hodnotu
přesně opačnou. Uděláme si tedy další pomocnou proměnnou typu \if. Vše
by pak mohlo vypadat nějak takhle:

\newif\ifRadekPrecten
\RadekPrectentrue
\newread\vstup
\openin\vstup jmeno.souboru
\loop
  \ifeof\vstup
    \radekPrectenfalse % konec souboru
  \fi % \ifeof
  \ifRadekPrecten
    \read\vstup to \radek
    \expandafter\precti\radek;
\repeat % ukončí \loop
\closein\vstup

Stačí nadefinovat \precti, aby to s parametry udělalo požadované,
doplnit \documentclass, \begin{document}, \end{document} a doufat, že
jsem to z hlavy bez vyzkoušení napsal správně.

> Předem děkuji.
>
> Zdravím
>
> Lukáš Procházka
>
>
> --
>
> Ing. Lukáš Procházka [LPr at pontex.cz <mailto:LPr at pontex.cz>]
> Pontex s. r. o.      [www.pontex.cz <http://www.pontex.cz>]
> [pontex at pontex.cz <mailto:pontex at pontex.cz>]
> Bezová 1658
> 147 14 Praha 4
>
> Tel: +420 244 06 22 38
> Fax: +420 244 46 10 38
>
>
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>
>



-- 
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz


More information about the csTeX mailing list