latex - jak lze vytvorit pole hodnot a jak s nim pracovat?

David Necas (Yeti) yeti at physics.muni.cz
Sun Feb 13 20:33:21 CET 2005


On Sun, Feb 13, 2005 at 04:31:26PM +0100, hucik at inext.cz wrote:
> chtel bych vas pozadat o radu (mozna by stacil jen dobre namireny odkaz:)
> 
> Snazim se v latexu vytvorit zdrojak pro sazbu ucetnich faktur, jehoz
> kompilaci volam ze sveho programu.
> Veskere vstupni promenne, ktere ovlivnuji sazbu vkladam do zdroje pres
> \def\promenna{hodnota}, coz je docela prijemne, ale pro pripad, kdy dojde
> na sazbu jednotlivych polozek faktury uz to tak hezky nevypada:
> 
> %%%%%%%%%%%%%%%%%%%%%%%
> % pokud jsou polozky, tak vytvorime longtable
> \ifthenelse{\equal{\pocetpolozek}{0}}{}{
> \begin{longtable}.....
> 
> % v tomto miste musime pro kazdou polozku zavolat prikaz \polozka
> \polozka{nazev}{katalog}{pocetmj}{mj}{cenamj}{dph}{cenabezdph}{cenasdph}{pozn}
> \polozka{nazev}{katalog}{pocetmj}{mj}{cenamj}{dph}{cenabezdph}{cenasdph}{pozn}
> \polozka{nazev}{katalog}{pocetmj}{mj}{cenamj}{dph}{cenabezdph}{cenasdph}{pozn}
> \polozka{nazev}{katalog}{pocetmj}{mj}{cenamj}{dph}{cenabezdph}{cenasdph}{pozn}
> 
> \end{longtable}
> }
> %%%%%%%%%%%%%%%%%%%%%%%
> 
> Zajimalo by mne, zda-li syntaxe povoluje to, abych mohl na zacatku
> dokumentu definovat nejake pole hodnot (po perlovsku hash :), ktere bych
> mohl uvnitr te longtable krokovat a predavat prikazu polozka, ktery pak
> upravuje sazbu jednotlivych radku podle obsahu ruznych parametru, ktere
> zde asi nyni nema smysl uvadet.

Stejně jako řada dalších jazyků umí TeX hashe ve svém
vlastním jmenném prostoru. Často to stačí. Jinak přikládám
jednoduchou (tj. poměrně křehkou) implementaci, která jmenný
prostor TeXu jako hashovou tabulku využívá, ale má
,explicitní API` (registry typu \toks nepoužívá, protože je
jich omezený počet). Ale popravdě řečeno nevím, jak by
hashová tabulka řešila váš problém, protože jsem úplně
nepochopil, v čem je a co dělá ten příkaz \polozka.

Implementace hashe

% Create a new hash table
\def\newhash#1{\expandafter\def\csname hashkeys:#1\endcsname{}}
% Set value indetinfied by key #2 in table #1 to #3
\def\set#1[#2]=#3{\expandafter\ifx\csname hash:#1:#2\endcsname\relax
    \edef\tmpkeys{\csname hashkeys:#1\endcsname}%
    \expandafter\edef\csname hashkeys:#1\endcsname{\tmpkeys{#2}}\fi
  \expandafter\def\csname hash:#1:#2\endcsname{#3}}
% Get value indetinfied by key #2 from table #1
\def\get#1[#2]{\csname hash:#1:#2\endcsname\ignorespaces}
% Get value indetinfied by key #2 from table #1, raising an error if there's
% no such key
\def\geterr#1[#2]{\expandafter\ifx\csname hash:#1:#2\endcsname\relax
  \error\else\csname hash:#1:#2\endcsname\fi\ignorespaces}
% Delete value indetinfied by key #2 from table #1
\def\del#1[#2]{\let\next\hashdeletenext\def\keytofind{#2}\def\tmpkeys{}%
  \expandafter\let\expandafter\tmp\csname hashkeys:#1\endcsname
  \expandafter\next\tmp\end
  \expandafter\edef\csname hashkeys:#1\endcsname{\tmpkeys}%
  \expandafter\let\csname hash:#1:#2\endcsname\relax\ignorespaces}
\def\hashdeletenext#1{\ifx\end#1\let\next\relax\else
    \def\tmp{#1}\ifx\tmp\keytofind\else\edef\tmpkeys{\tmpkeys{#1}}\fi
  \fi\next}

Debugovací makra vypisující celou tabulku a pod.

% Debug
\def\testget#1[#2]{{\tt#1[#2]=\get#1[#2]}\par}
\def\printhash#1{\par\noindent Dump of hash table {\tt#1}%
  \let\next\hashprintnext\def\tmp{#1}%
  \expandafter\let\expandafter\tmpkeys\csname hashkeys:#1\endcsname
  \expandafter\next\tmpkeys\end\par}
\def\hashprintnext#1{\ifx\end#1\let\next\relax\else
  {\hfil\break\tt\tmp[#1]=\csname hash:\tmp:#1\endcsname}\fi\next}

Testovací dokument

\parindent=0pt
\parskip=12pt

\newhash{tabulka}
\set tabulka[foo]={bar}
\set tabulka[a b c]={}
\set tabulka[klíč]={Nějaká hodnota}

\printhash{tabulka}

\keys{tabulka}

\testget tabulka[klíč]
\testget tabulka[foo]
\testget tabulka[neexistuje]
%\geterr tabulka[neexistuje]
Mažu klíč {\tt foo}\del tabulka[foo]\par

\printhash{tabulka}

Yeti


--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?




More information about the csTeX mailing list