[cstex] Složené závorky v masce a separátorech parametrů maker

Jaroslav Hajtmar hajtmar at gyza.cz
Sat Jun 6 18:12:36 CEST 2020


Díky pane Wagnere za doplnění a za dobrý tip. 
Hranaté závorky jsou doménou Mathematica, kde slouží k uzavření parametrů a já jsem jen chtěl jen ze zdrojáku Mathematica vykopírovat vygenerované texty a nijak dál už to ručně neupravovat, což bylo asi jen zbytečné bazírování na drobnosti, která šla obejít několika kliky v textovém editoru (CMD+F). Asi bych tak ušetřil dost času, kdybych se nevyhýbal drobným ručním úpravám vygenerovaných textů. 
Na druhou stranu beru každou takovou věc jako výzvu, díky které se něco nového dozvím, což se mi zase hodí někdy později…. a tak dokola… 

Když píšete o postupném “ujídání” parametrů, tak tato věc je mi známa a běžně jsem ji používal - proto jsem psal, že přes strom jsem neviděl les… 
Na tomto příkladu si uvědomuji, jak moc a jak rychle zapomínám dlouhodobě nepoužívané věci…

Pěkný den a ještě jednou díky.
Jarda Hajtmar


> 6. 6. 2020 v 13:20, Zdenek Wagner <zdenek.wagner at gmail.com>:
> 
> Dobrý den,
> 
> pokud je možno ovlivnit příslušní generovaný kód, tak bych vynechal ty
> nadbytečné hranaté závorky, tedy vypadalo by to
> 
> \InvMat {{1,2,3},{4,5,6}}
> 
> Mezery mezi \InvMat a první závorkou nevadí, protože po kontrolní
> sekvenci je TeX v režimu ignorování mezer. Definice by pak byla
> změněna na \def\InvMat#1{... a zbytek by byl stejný. Mezery za
> poslední párovou závorkou by tedy makro \InvMat nevidělo.
> 
> Mimochodem, trik s postupným "ujídáním" parametrů a jejich střádáním v
> token registru nebo v makru je dost běžný a často ho používám. Naučil
> jsem se to studiem maker Franka Mittelbacha.
> 
> Zdeněk Wagner
> http://ttsm.icpf.cas.cz/team/wagner.shtml
> http://icebearsoft.euweb.cz
> 
> so 6. 6. 2020 v 13:11 odesílatel Jaroslav Hajtmar <hajtmar at gyza.cz> napsal:
>> 
>> Dobrý den.
>> 
>> Mnohokrát děkuji Honzovi Šustkovi za ukázku toho, jak pro strom není vidět les - tak to bohužel mívám hodně často :-)… Co dodat? Snad jen filmovou “Pelíškovou” hlášku: “A přitom taková blbost!” :-). Přesně takto jsem si myslel, že to dopadne … :-) - díky Honzo!
>> 
>> A panu Wagnerovi děkuji mnohokrát za insiprující studijní materiál… (který jistě potěší i další vděčné “věčné začátečníky”, jako je moje maličkost… )
>> 
>> Abych se přiznal, jsem na vážkách, na základě které rady to udělat. Vzhledem k tomu, že mi stačí pro studenty v rámci testu dávat z časových důvodů matice řádu 2-4, tak lze pro matice 2., 3. a 4. řádu napsat samostatná speciální makra s mírně odlišným názvem tak, aby manuální zásahy byly minimální.
>> 
>> Na druhou stranu mi připadá smysluplné udělat to spíš podle rady pana Wagnera, zejména proto, že data pro sazbu matic vznikají “strojově” a tím pádem není problém zabezpečit funkční vstupní datový formát maker a nemusel pro každý typ matice ručně mírně modifikovat název speciálního makra pro sazbu daného typu matice…
>> 
>> BTW: Už se moc těším, na reakce studentů, až zjistí, že má v testu každý z nich úplně jiné příklady ;-). V období distanční výuky, kdy on-line testy v Teamsech řeší studenti týmově s využitím skype, messengeru atd… a průměr z testů se mi limitně blíží k 1 (ačkoliv jindy to je kolem 2.5) tuto moji aktivitu jistě ocení :-)…
>> 
>> Každopádně mnohokrát děkuji za cenní rady a přeji krásný víkend.
>> 
>> Jarda Hajtmar
>> 
>> 
>> 
>> 6. 6. 2020 v 12:21, Zdenek Wagner <zdenek.wagner at gmail.com>:
>> 
>> Dobrý den,
>> 
>> složené závorky nemohou v masce fungovast, protože mají kategorie 1 a
>> 2. Řádek \def\InvMat[{#1,#2}]{\thematrix{#1;#2}} tedy pro TeX znamená,
>> že při použití musí za tokenem \InvMat následovat [ a tato dvojice
>> tokenů má expandovat na #1,#2 (s odstraněnými závorkami, které
>> ohraničují tělo definice). Tato definice je však chybná, protože
>> \InvMat je makro bez parametrů. V definici on J, Šustka makro \InvMat
>> při expanzi odstraní vnější {} a makro \InvMatA totéž udělá s každým
>> parametrem, proto se při použití \thematrix musí znovu ke každému
>> parametru přidat. Definice pro obecný počet řádků e složitější, ale ne
>> o moc, mně funguje toto:
>> 
>> \def\thematrix#1{\message{^^J\string\thematrix{#1}^^J}} % abych viděl,
>> co to dělá
>> \newtoks\InvToks
>> \def\InvMat[#1]{\InvToks{}\InvMatA#1,\InvMatA}
>> \def\InvMatA#1,#2\InvMatA{%
>> \ifcat$\the\InvToks$\else \InvToks\expandafter{\the\InvToks;}\fi
>> \InvToks\expandafter{\the\InvToks{#1}}%
>> \ifcat$#2$\def\next{\expandafter\thematrix\expandafter{\the\InvToks}}%
>> \else
>>   \def\next{\InvMatA#2\InvMatA}%
>> \fi
>> \next}
>> 
>> \InvMat[{{1,2,3}}]
>> \InvMat[{{1,2,3},{4,5,6}}]
>> \InvMat[{{1,2,3},{4,5,6},{7,8,9}}]
>> \InvMat[{{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6},{7,8,9}}]
>> 
>> \bye
>> 
>> Při expanzi parametrů musí být tokeny s kategoriemi 1 a 2 párovány,
>> proto čárky uvnitř závorek neslouží jako separátory parametrů.
>> 
>> Makro \thematrix jsem si definoval jen proto, abych viděl, že mi to
>> funguje správně.
>> 
>> Poznámka, neošetřoval jsem případné mezery na konci, tedy pokud místo
>> }}] bude použito }} ], } }] nebo } } ], makro nebude fungovat a spadne
>> nejspíš do nekonečné smyčky, které vzhledem k "tail expansion"
>> nezvětšuje použitý stack, takže bude opravdu nekonečná (skončí až
>> vyčerpáním veškeré paměti pro \InvToks).
>> 
>> Zdeněk Wagner
>> http://ttsm.icpf.cas.cz/team/wagner.shtml
>> http://icebearsoft.euweb.cz
>> 
>> so 6. 6. 2020 v 10:42 odesílatel Jan Sustek <Jan.Sustek at seznam.cz> napsal:
>> 
>> 
>> Ahoj Jardo,
>> zkus toto.
>> 
>> \def\InvMat[#1]{\InvMatA#1}
>> \def\InvMatA#1,#2{\thematrix{{#1};{#2}}}
>> 
>> Funguje to pro dvouřádkové matice. Jestli to má být pro jiný konkrétní počet řádků, tak to bude podobné. Jestli to má být pro obecný počet řádků, bylo by řešení jemně komplikovanější, ale taky by to šlo.
>> 
>> Měj se hezky.
>> Honza
>> 
>> 
>> 
>> ---------- Původní e-mail ----------
>> Od: Jaroslav Hajtmar <hajtmar at gyza.cz>
>> Komu: Czech and Slovak TeX-related mailing list <csTeX at cs.felk.cvut.cz>
>> Datum: 6. 6. 2020 9:54:51
>> Předmět: [cstex] Složené závorky v masce a separátorech parametrů maker
>> 
>> Dobrý den všem v konfeře.
>> Rád bych se po dlouhé době zeptal na možná triviální otázku, nicméně jsem nic nedohledal ani v PDFkové verzi TBN, kterou jsem krátce rozkliknul…
>> 
>> Nejprve se v úvodu zeptám a v závěru pak vysvětlím svoji motivaci.
>> 
>> Otázka: Existuje možnost použít složené závorky v masce parametru makra, abych zároveň nepřišel o vyseparované parametry maker?
>> 
>> Uvedu příklad definice svého makra \InvMat. Upozorňuji, že se jedná o makro ConTeXtu, což má význam jen z hlediska toho, že makro \thematrix sází v ConTeXtu matici.
>> 
>> Např. \thematrix{{1, 2, 3}; {-1, 2, 1}} vysází dvouřádkovou matici se třemi sloupci.Tento příklad ukazuje, co vlastně chci.
>> 
>> 
>> 
>> Rád bych vytvořil makro:
>> 
>> \def\InvMat[{#1,#2}]{\thematrix{#1;#2}}
>> 
>> které by umožnilo vysázet velký počet dvouřádkových matic tak, aby oba parametry makra InvMat byly obsaženy v masce [{ …… }].
>> Na okraj dodávám, že  úmyslně píši velký počet, protože pokud by se jednalo o několik matic, tak bych to tímto způsobem vůbec nedělal…
>> 
>> 
>> Příklad použití:
>> 
>> \InvMat[{{1, 2, 3}; {-1, 2, 1}}] by mělo dát stejný výsledek jako \thematrix{{1, 2, 3}; {-1, 2, 1}}.
>> 
>> Na této variantě jsem si vylámal zuby, nicméně jsem schopen použít variantu (již v praxi použitelnou, nicméně trochu prudící):
>> 
>> \def\InvMat[\{#1,#2}\]{\thematrix{#1;#2}}  …. tj. s backslashem před úvodní a koncovou složenou závorkou. Toto makro mi funguje - volám jej takto:
>> 
>> \InvMat[\{{1, 2, 3}; {-1, 2, 1}\}]
>> 
>> To mne trochu obtěžuje, protože musím ty backslashe manuálně vkládat.
>> 
>> Neexistuje nějaká možnost (předpokládám, že ano a jak se znám je stupidní :-) … ), jak dosáhnout funkčního výsledku při definici makra \InvMat prvním způsobem, tj.
>> 
>> \def\InvMat[{#1,#2}]{\thematrix{#1;#2}}
>> 
>> 
>> 
>> Díky za případné rady a pěkný den všem.
>> Jarda Hajtmar
>> 
>> 
>> PS1: Doufám, že jste všichni ve zdraví a při silném pracovním nasazení v rámci distanční výuky přežili dobíhající “koronaepidemónii” a přeji všem brzký návrat k (jak se zdá) “normáluizaci”...
>> 
>> PS2: Přidávám vysvětlení pozadí celé záležitosti a mé motivace pro ty, kterým leží v hlavě PROČ to chci zrovna tak pošahaně:
>> 
>> V CAS Mathematica mi funkce InvMat pro generování matic a k nim inverzních matic dává na vstupu/výstupu následující výstup:
>> 
>> In[149]:= InvMat[{{1, 0, 0}, {1, 2, 1}, {0, 1, 1}}]
>> 
>> \InvMat[{{1,0,0},{-1,1,-1},{1,-1,2}}]
>> 
>> Out[149]= 2
>> 
>> Tento výstup ve finále vyexportuji ve tvaru, kde v 1. řádku volám svoji Mathematica funkci, ve 2. řádku je výsledná inverzní matice a ve 3. řádku je součet všech prvků výsledné matice:
>> 
>> InvMat[{{1, 0, 0}, {1, 2, 1}, {0, 1, 1}}] % vstupní volání mathematica funkce
>> \InvMat[{{1,0,0},{-1,1,-1},{1,-1,2}}] % výstupní inverzní matice s prefixem pro ConTeXtovou sazbu
>> 2 % výstupní údaj - součet všech prvků inverzní matice (kvůli snazšímu opravování testů v Teams assignments)
>> 
>> 
>> Moje motivace je nyní taková, že chci použít tento zdrojový text generovaný v Mathematica pro vygenerování CSV tabulky, z níž pak z ConTeXtem pomocí dávkového zpracování vysázím zadání prověrky pro větší množství studentů tak, aby měl každý student naprosto jiné zadání a přitom byla snadná automatická kontrola výsledků pomocí součtu všech prvků v inverzní matici.
>> 
>> Pěkný den.
>> Jarda
>> 
>> 
>> 
>> 
>> _______________________________________________
>> 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
> 
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> https://lists.felk.cvut.cz/mailman/listinfo/cstex




More information about the csTeX mailing list