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

Zdenek Wagner zdenek.wagner at gmail.com
Sat Jun 6 12:21:51 CEST 2020


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



More information about the csTeX mailing list