[cstex] Volitelny argument v tvare [(x1, y1)(x2, y2)...(xn, yn)], ako na to?

Tomáš Fábry fabry.tomas at gmail.com
Mon May 2 18:18:07 CEST 2011


On May 2, 11:57 am, Jan Sustek <Jan.Sus... at seznam.cz> wrote:
> Dobry den,
>
> pokud jde o nacitani neznameho poctu volitelnych argumentu, jde to s primitivem \futurelet jednoduse. Dokonce se to da udelat tak, ze nejsou treba ani hranate zavorky. To zjednodusi jak zapisovani uzivatelum, tak programovani toho makra. Nacitani resi nize uvedena makra \dalsiznak, \testuj a \dalsibod. Makro \konecsipky pak s nactenymi udaji neco udela, ve Vasem pripade vykresli tu sipku. Ale to uz nezavisi na tom nacitani a to necham na Vas. :-)
>
> Pekny den preje
> Jan Sustek
>
> \newcount\pomocny
> \newcount\pocetbodu
> \def\sipka#1{\def\prvnibod{#1}%
>   \pocetbodu0
>   \dalsiznak}
> \def\dalsiznak{\futurelet\znak\testuj}
> \def\testuj{\ifx\znak(\let\nxt\dalsibod\else\let\nxt\konecsipky\fi\nxt}
> \def\dalsibod(#1,#2){\advance\pocetbodu1
>   \expandafter\def\csname x\the\pocetbodu\endcsname{#1}%
>   \expandafter\def\csname y\the\pocetbodu\endcsname{#2}%
>   \dalsiznak}
> \def\konecsipky#1{\def\poslednibod{#1}%
>   Sipka vychazi z bodu \prvnibod\ do bodu \poslednibod\
>   \ifnum\pocetbodu>0
>     a prochazi pres body
>     \pomocny0
>     \loop\ifnum\pomocny<\pocetbodu \advance\pomocny1
>       (\csname x\the\pomocny\endcsname,\csname y\the\pomocny\endcsname)
>     \repeat
>   \fi
>   \unskip.}
>
> \begin{document}
> \sipka{(10,10)}{(15,15)}
> \sipka{(1,1)}(1,2)(1,5)(2,8)(9,3){(11,4)}
> \end{document}
>
> > ------------ Původní zpráva ------------
> > Od: Tomáš Fábry <fabry.to... at gmail.com>
> > Předmět: [cstex] Volitelny argument v tvare [(x1, y1)(x2, y2)...(xn, yn)], ako
> > na to?
> > Datum: 01.5.2011 23:10:04
> > ----------------------------------------
> > Zdravim vas,
>
> > robim sty balicek, ktory pomocou tikz vykresluje zlozitejsie obrazce.
> > Potreboval by som vyrobit prikaz v tvare:
>
> > \arrow{u1}[(x1,y1)...(xn,yn)]{u2}
>
> > Prikaz by mal nakreslit sipku od objektu k objektu. Povedzme, ze
> > objekty su nejake uzly s textom, konkretne:
>
> > \node (u1) at (xu1,yu1) {text1};
> > \node (u2) at {xu2,yu2} {text2};
>
> > Vo volitelnom parametri by malo byt mozne zadat suradnice bodov, cez
> > ktore bude sipka prechadzat. Nie je dopredu zname, kolko tychto bodov
> > bude zadanych, mozno ziadny a mozno n.
>
> > Mam len malo skusenosti s tvorbou balickou a v tomto pripade absolutne
> > nemam predstavu ako taketo nieco dosiahnut. Nasiel by sa niekto, kto
> > by mi vedel poradit?
>
> > Velmi pekne dakujem.
>
> > S pozdravom TF
> > _______________________________________________
> > csTeX mailing list
> > cs... at cs.felk.cvut.cz
> >http://lists.felk.cvut.cz/mailman/listinfo/cstex

Zdravim, Vas sposob mi pride najviac elegantny, velmi pekne dakujem.
Upravil som si ho pre svoje potreby (neviem, ci zrovna elegantne), ale
funguje, no predsa ak by to bolo mozne potreboval by som tam tie
hranate zatvorky, je to v poziadavkach syntaxe, ktoru mam danu. Vedeli
by ste s tym nieco urobit? Moj kod vyzera takto:

\documentclass[10pt,a4paper]{article}

\usepackage{tikz}

\newcount\pomoczacatek
\newcount\pomockonec
\newcount\pocetbodu

\def\sipka#1{\def\prvnibod{#1}%
  \pocetbodu0
  \dalsiznak
}

\def\dalsiznak{
  \futurelet\znak\testuj
}

\def\testuj{
   \ifx\znak(\let\nxt\dalsibod\else\let\nxt\konecsipky\fi\nxt
}

\def\dalsibod(#1,#2){\advance\pocetbodu1
  \expandafter\def\csname x\the\pocetbodu\endcsname{#1}%
  \expandafter\def\csname y\the\pocetbodu\endcsname{#2}%
  \dalsiznak
}

\def\konecsipky#1{
  \def\poslednibod{#1}%

  \ifnum\pocetbodu=0
    \draw[-stealth] \prvnibod -- \poslednibod;
  \fi

  \ifnum\pocetbodu>0
    \pomoczacatek0
    \pomockonec1
    \advance\pocetbodu-1
    \draw \prvnibod -- (\csname x\the\pomockonec\endcsname,\csname y
\the\pomockonec\endcsname);
    \loop\ifnum\pomoczacatek<\pocetbodu \advance\pomoczacatek1
\advance \pomockonec1
      \draw (\csname x\the\pomoczacatek\endcsname,\csname y\the
\pomoczacatek\endcsname)  --%
            (\csname x\the\pomockonec\endcsname,\csname y\the
\pomockonec\endcsname);
    \repeat
    \draw[-stealth] (\csname x\the\pomockonec\endcsname,\csname y\the
\pomockonec\endcsname) -- \poslednibod;
  \fi
  \unskip
}

\begin{document}
\begin{tikzpicture}
\sipka{(2,2)}{(4,4)}
\sipka{(1,1)}(6,2)(4,9){(11,4)}
\end{tikzpicture}
\end{document}



More information about the csTeX mailing list