Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Plain: parametr se zpětným lomítkem

4 views
Skip to first unread message

T.K.

unread,
Feb 8, 2013, 4:37:43 AM2/8/13
to
Dobrý den,
prosím o „nakopnutí“, evidentně něco přehlížím.

Potřebuji (v plainu), aby \mojemakro pracovalo s obsahem parametru,
který může případně mít na konci zpětné lomítko (coby běžný znak).
Myslel jsem, že to umožním tak, že \mojemakro (definované bez parametru)
jen otevře skupinu, v ní změní kategorii zpětného lomítka na 12 a spustí
\pomocnemakro, které načte parametr, zpracuje ho a uzavře skupinu.
Jenže zpětné lomítko i tak očividně zneviditelňuje pravou složenou
závorku jako konec čtení parametru. Kde je, prosím, zakopaný pes?
Předem díky
Tomáš Kučera

Minimalizovaný soubor:

\def\mojemakro{\bgroup\catcode`\\=12\pomocnemakro}
\def\pomocnemakro#1{#1\egroup}
\mojemakro{abc\}
\bye

Jan Moskyto Matejka

unread,
Feb 8, 2013, 5:06:38 AM2/8/13
to Czech and Slovak TeX-related mailing list
Dobrý den

> \def\mojemakro{\bgroup\catcode`\\=12\pomocnemakro}
> \def\pomocnemakro#1{#1\egroup}
> \mojemakro{abc\}
> \bye

\mojemakro otevře skupinu, přečte \catcode, přečte kód znaku (`\\),
rovnítko a čte číslo. Dvanáctka je v pohodě, ale pak se rovnou pokusí
expandovat \pomocnemakro, co kdyby jeho expanze začínala číslem.

Správné řešení je za dvanáctku dát \relax.

MQ
--
Jan Matejka aka 'Moskyto' <m...@ucw.cz>
Homepage: http://mq.ucw.cz/
Phone: +420 721 047 653 (only if really necessary, pls)
--
I tell you that, if these should hold their peace,
the stones would immediately cry out.
Luke 19:1
signature.asc

Milan Vancura

unread,
Feb 8, 2013, 5:07:52 AM2/8/13
to Czech and Slovak TeX-related mailing list
> prosím o „nakopnutí“, evidentně něco přehlížím.

Dobrý den,

bohužel to není jeden malý detail, ale celá kapitola v TeXbook naruby - nutnost
pochopit celý systém, jak TeX pracuje s kategoriemi znaků, kdy načítá co atp.

> \def\mojemakro{\bgroup\catcode`\\=12\pomocnemakro}
> \def\pomocnemakro#1{#1\egroup}
> \mojemakro{abc\}
> \bye

Ve zkratce: '\' v parametru \mojemakro rozhodně nemá kategorii 12, protože TeX
při načítání zdrojového textu až do tohoto momentu nikde takovou kategorii
znaku '\' nenastavil - proto to vezme jako řídící sekvenci '\}' a z toho plynou
všechny následující chyby.

Jak to odstranit, jaké další problémy nastanou až odstraníte toto, a jak vůbec
pracovat s kategoriemi v TeXu se dozvite právě v TeXbooku naruby, i s moc
pěknými příklady. Jen se opatrně zeptám: kdy jste měl naposledy pořádný
bolehlav? :-)

Milan Vančura

Zdenek Wagner

unread,
Feb 8, 2013, 5:09:54 AM2/8/13
to Czech and Slovak TeX-related mailing list
Dne 8. �nora 2013 10:37 T.K. <mota...@seznam.cz> napsal(a):
> Dobrďż˝ den,
> pros�m o "nakopnut�", evidentn� n�co p�ehl��m.
>
> Pot�ebuji (v plainu), aby \mojemakro pracovalo s obsahem parametru,
> kter� m�e p��padn� m�t na konci zp�tn� lom�tko (coby b�n� znak).
> Myslel jsem, �e to umo�n�m tak, �e \mojemakro (definovan� bez parametru)
> jen otev�e skupinu, v n� zm�n� kategorii zp�tn�ho lom�tka na 12 a spust�
> \pomocnemakro, kter� na�te parametr, zpracuje ho a uzav�e skupinu.
> Jen�e zp�tn� lom�tko i tak o�ividn� zneviditel�uje pravou slo�enou
> z�vorku jako konec �ten� parametru. Kde je, pros�m, zakopan� pes?
> P�edem d�ky
> Tom� Ku�era
>
> Minimalizovanďż˝ soubor:
>
> \def\mojemakro{\bgroup\catcode`\\=12\pomocnemakro}

Chyb� mezera za dvan�ctkou. Ta mezera toti� ukon�� syntaktick�
pravidlo <��slo>. V t�to podob� se toti� za�ne expandovat \pomocne
makro je�t� p�ed zm�nou kategorie, tj. TeX dostane:

\catcode`\\=12{abc\}

V�e ve slo�en�ch z�vork�ch je na�teno je�t� p�ed zm�nou kategorie. Pak
teprve m� procesor �anci zjistit, �a ��slo je 12, ale u� d��ve najde
probl�m se z�vorkami. Mezera zp�sob�, �e se kategorie zm�n� je�t� p�ed
expanzďż˝ makra \pomocnemakro.

> \def\pomocnemakro#1{#1\egroup}

Mimochoden, v t�to definici se d� oto�it po�ad�:

\def\pomocnemakro#1{\egroup#1}

Token se toti� na�etl je�t� p�ed \egroup, tedy zp�tn� lom�tko m�lo
kategorii 12. Pak m�te mo�nost v definici snadno pou��t kontroln�
sekvence, nap�. lze ps�t:

\def\pomocnemakro#1{\egroup{\tt #1}}

> \mojemakro{abc\}
> \bye
> _______________________________________________
> csTeX mailing list
> cs...@cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex



--
Zden�k Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz

T.K.

unread,
Feb 8, 2013, 7:15:55 AM2/8/13
to
Děkuji všem za odpovědi, pomohly mi odhalit pravou příčinu, která ale
byla někde jinde. Po doplnění \relax za dvanáctku minimální příklad
fungoval, v mém původním souboru ale ten \relax už byl! Jen kvůli tomu
zapomenutému \relaxu končil i min. příklad stejnou chybou, jako původní
makro. Takže skutečnou příčinu jsem při tvorbě minimálního příkladu ze
souboru „vyminimalizoval“. Už jsem ji našel, ale radši se tu nebudu
přiznávat, co to bylo… Přínos pro ostatní by byl stejně nulový.

Ještě jednou díky!

Tomáš Kučera





Dne 8.2.2013 11:09, Zdenek Wagner napsal(a):
> Dne 8. února 2013 10:37 T.K. <mota...@seznam.cz> napsal(a):
>> Dobrý den,
>> prosím o "nakopnutí", evidentně něco přehlížím.
>>
>> Potřebuji (v plainu), aby \mojemakro pracovalo s obsahem parametru,
>> který může případně mít na konci zpětné lomítko (coby běžný znak).
>> Myslel jsem, že to umožním tak, že \mojemakro (definované bez parametru)
>> jen otevře skupinu, v ní změní kategorii zpětného lomítka na 12 a spustí
>> \pomocnemakro, které načte parametr, zpracuje ho a uzavře skupinu.
>> Jenže zpětné lomítko i tak očividně zneviditelňuje pravou složenou
>> závorku jako konec čtení parametru. Kde je, prosím, zakopaný pes?
>> Předem díky
>> Tomáš Kučera
>>
>> Minimalizovaný soubor:
>>
>> \def\mojemakro{\bgroup\catcode`\\=12\pomocnemakro}
>
> Chybí mezera za dvanáctkou. Ta mezera totiž ukončí syntaktické
> pravidlo <číslo>. V této podobě se totiž začne expandovat \pomocne
> makro ještě před změnou kategorie, tj. TeX dostane:
>
> \catcode`\\=12{abc\}
>
> Vše ve složených závorkách je načteno ještě před změnou kategorie. Pak
> teprve má procesor šanci zjistit, ža číslo je 12, ale už dříve najde
> problém se závorkami. Mezera způsobí, že se kategorie změní ještě před
> expanzí makra \pomocnemakro.
>
>> \def\pomocnemakro#1{#1\egroup}
>
> Mimochoden, v této definici se dá otočit pořadí:
>
> \def\pomocnemakro#1{\egroup#1}
>
> Token se totiž načetl ještě před \egroup, tedy zpětné lomítko mělo
> kategorii 12. Pak máte možnost v definici snadno použít kontrolní
> sekvence, např. lze psát:

Jaroslav Hajtmar

unread,
Feb 8, 2013, 7:38:57 AM2/8/13
to Czech and Slovak TeX-related mailing list
Na druhou stranu byste tím možná někomu zvednul sebevědomí :-).
J.Hajtmar


Dne 8.2.2013 13:15, T.K. napsal(a):
0 new messages