[cstex] Makra pro práci s textovými řetězci ("připojování" textu)

Zdenek Wagner zdenek.wagner at gmail.com
Tue Jun 30 12:55:59 CEST 2015


Dobrý den,

nedíval jsem se na to důkladně, ale při současné definici
\addto{\NeklPredmety}{\zkratkapredmetu{\csvcell[\row,\column]}, }
přidá do makra neexpandovaný token \NeklPredmety a při přidávání
dalších textů stále zůstává neexpandovaný. To pak může vadit v
nějakých testech, pokud se předpokládá, že jsou tam jen textové
řetězce, nikoliv makra. Pokud je nutno mít v makru textové řetězce s
tím, že se někdy přidá makro, které je expandovatelné pouze na textové
řetězce (a neobsahuje potenciálně škodlivé řídicí sekvence), pak je
nutno přepsat přidávání textů pomocí \edef (a tím odpadnou mnohé
\expandafter).
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz


Dne 30. června 2015 12:35 Jan Sustek <Jan.Sustek at seznam.cz> napsal(a):
> Ahoj Jardo,
>
> na první pohled nevidím, co se v těch konkrétních cyklech přesně děje. Ale
> mohlo by pomoct expandované addto (napr. \eaddto), kdy se před přidáním do
> seznamu ten přídavek úplně expanduje.
>
> \long\def\eaddto#1#2{\edef#1{#1#2}}
>
> Honza
>
> ---------- Původní zpráva ----------
> Od: Jaroslav Hajtmar <hajtmar at gyza.cz>
> Komu: cstex at cs.felk.cvut.cz
> Datum: 30. 6. 2015 12:19:47
> Předmět: Re: [cstex] Makra pro práci s textovými řetězci ("připojování"
> textu)
>
>
> Dobrý den.
> Díky pane Olšáku za užitečné řešení. Zatím jsem nic takového
> nepotřeboval, ale teď se to mi to bude určitě hodit. Když příjde na věc,
> tak dávám spíš přednost TeXovému řešení před Lua řešením, nicméně limity
> mých TeXovým možností jsou mnohem níže než Luových, takže mi kolikrát
> nezbyde nic jiného než to (někdy i zbytečně komplikovaně) obejít v Lua :-).
>
> Ještě bych v tuto chvíli potřeboval poradit. Zkoušel jsem totiž s makrem
> \addto experimentovat a když dělám i složitější případy (vkládané
> řetězce jsou v makrech atd...) zdá se, že vše funguje, jak má.
> Když ovšem nakonec vložím finálně do makra "\neklpredmety", tak bohužel
> dojde někde k chybě.
>
> \def\neklpredmety{%
> \neklasifikovanyzakfalse
> \def\NeklPredmety{}
> \dostepwiserecurse{24}{58}{1}{\if\csvcell[\recurselevel,\linepointer]N
> \addto{\NeklPredmety}{\zkratkapredmetu{\csvcell[\recurselevel,0]},
> }\neklasifikovanyzaktrue \fi}%
> \dostepwiserecurse{75}{85}{1}{\if\csvcell[\recurselevel,\linepointer]N
> \addto{\NeklPredmety}{\zkratkapredmetu{\csvcell[\recurselevel,0]},
> }\neklasifikovanyzaktrue \fi}%
> }
>
> Princip je snad zřejmý. Prohledat aktuální řádek a v něm nalézt znaky
> "N", indikující neklasifikovaný předmět. Pokud najde aspoň jeden, tak
> nastaví příznak na \neklasifikovanyzaktrue a přidá tento předmět do
> seznamu neklasifikovaných. (Následně daného žáka vypíše s jeho všemi
> neklasifikovanými předměty.)
>
> Nenapadá Vás, prosím, kde je problém? Zdá se, že to zlobí až uvnitř
> cyklu \dostepwiserecurse{from}{to}{step}{what to do}, kde se v makru
> \recurselevel vyhodnocuje počet proběhlých cyklů.
>
> V tuto chvíli nejsem schopen bohužel v plainu připravit (nepodařilo se
> mi to zrealizovat) nějaký minimální příklad toho, kde se to zasekává,
> nicméně dolů vkládám aspoň část kódu z něhož snad lze vyjít.
>
> \long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
> \def\NeklPredmety{}
> \def\zkratkapredmetu#1{#1}
> \def\csvcell[#1,#2]{Ch}
> \def\row{1}
> \def\column{3}
>
>
> \addto{\NeklPredmety}{CjL, }
> \addto{\NeklPredmety}{M, }
>
> \addto{\NeklPredmety}{\zkratkapredmetu{\csvcell[\row,\column]}, }
>
>
> column: \column
>
> row: \row
>
> csvcell: \csvcell[\row,\column]
>
> \NeklPredmety
>
>
>
> \bye
>
>
>
> Díky za případnou radu.
> Pěkný den přeje
> Jarda Hajtmar
>
>
>
>
>
> Dne 30. 6. 2015 v 6:09 Petr Olsak napsal(a):
>>
>> Dobrý den,
>>
>> s něčím podobným se musel setkat asi každý. V OPmac je na to
>> připraveno makro \addto.
>>
>> V dotazu mícháte dvě věci dohromady: přidávání obsahu do makra
>> (například pomocí \addto) a otázka návratu hodnoty, tj. užití makra.
>>
>> Může to vypadat třeba takto:
>>
>> \long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
>> \long\def\jointocontent#1{\addto\mycontent{#1}\mycontent}
>>
>> \def\mycontent{} % inicializace
>> \jointocontent{AAA} % vrátí AAA
>> \jointocontent{BBB} % vrátí AAABBB
>> \jointocontent{CCC} % vrátí AAABBBCCC
>>
>> \bye
>>
>>
>>
>> On Tue, 30 Jun 2015, Jaroslav Hajtmar wrote:
>>
>>> Dobrý den.
>>>
>>> Hledám nějaké TeXové řešení "zřetězování" maker. Jde mi o to, že
>>> potřebuji v nějakém cyklu provádět test a v případě vyhovujícího
>>> výsledku potřebuji připojit nějaký text k obsahu stávajícího makra.
>>> Něco jako tohle:
>>>
>>> \def\jointocontent{} % inicializace
>>> \jointocontent{AAA} % vrátí AAA
>>> \jointocontent{BBB} % vrátí AAABBB
>>> \jointocontent{CCC} % vrátí AAABBBCCC
>>>
>>>
>>> Pokoušel jsem se najít nějaké řešení. Něco šlo najít pod hesly jako
>>> concatenate atd... Něco jsem našel ale nic z toho nesplňovalo moje
>>> představy. Jde to vůbec v principu nějak rozumně udělat? Opět avizuji
>>> svůj osobní problém s vícenásobnou expanzí atd... :-)
>>>
>>> Upozorňuji na to, že pomocí Lua jde snadno udělat něco v tomto duchu:
>>>
>>> \savetomybuffer{} % inicializace
>>> \addtomybuffer{AAAA} % připojení AAA
>>> \addtomybuffer{BBB}
>>> \addtomybuffer{CCC}
>>>
>>> \getcontentofmybuffer % vrátí AAABBBCCC,
>>>
>>> ale jde mi spíš o principiální řešení přímo na úrovni TeXu.
>>>
>>> Nepotkali jste se s něčím podobným?
>>> Díky a jsem s pozdravem pěkného nadcházejícího dne.
>>> Jarda Hajtmar
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> csTeX mailing list
>>> csTeX at cs.felk.cvut.cz
>>> https://lists.felk.cvut.cz/mailman/listinfo/cstex
>>>
>>>
>>
>>
>> _______________________________________________
>> csTeX mailing list
>> csTeX at cs.felk.cvut.cz
>> https://lists.felk.cvut.cz/mailman/listinfo/cstex
>
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> https://lists.felk.cvut.cz/mailman/listinfo/cstex
>
>
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> https://lists.felk.cvut.cz/mailman/listinfo/cstex
>




More information about the csTeX mailing list