About xstring and ConTeXt
Reading about macro bundles meant to be generic (format agnostic), some of them work in plain/LaTeX, but crash when loaded on ConTeXt. The following happens with xstring.tex tex error > tex error on line 372 in file xstring.tex: ! Illegal parameter number in definition of \xs_reserved_C <to be read again> 1 \xs_newlines ->\unexpanded {}\xs_def \xs_arg_i {##1 } \xs_newmacro_ ...name \xs_myarg }\edef \xs_reserved_C {\unexpanded \expandafter {\xs_newlines }\edef \noexpand \xs_call }\edef \xs_reserved_D {... l.372 \xs_newmacro\StrRemoveBraces{}{1}{1} {% <empty file> You meant to type ## instead of #, right? Or maybe a } was forgotten somewhere earlier, and things are all screwed up? I'm going to assume that you meant ##. I've tried changing the catcode regime, but with no effect. Don't misunderstand me. I'm aware of ConTeXt capabilities and string manipulation via Lua. My question is more like: "Why doesn't xstring.tex?" Sorry if my question is outside the scope of ConTeXt developers/maintainers. Thank you very much. Jairo :)
Hi Jairo,
ConTeXt's \unexpanded is e-TeX's \protected, so the error boils down to
something like: \edef\x{\unexpanded{#}}, which works in Plain but not in
ConTeXt.
Usually packages that claim to be generic have to cope with that.
xstring would need to do (in a ConTeXt-specific loader):
\let\xstring@unexpanded\normalunexpanded
and
\let\xstring@unexpanded\unexpanded
in Plain and LaTeX loaders, then then use \xstring@unexpanded in the
code. But `xstring` doesn't claim (that I found, at least) to be
compatible with ConTeXt, so it's understandable: though if it is
compatible with Plain, it wouldn't be hard to adapt to ConTeXt.
That said, you can load `xstring` if you do:
\let\unexpanded\normalunexpanded
\input xstring.tex
\let\unexpanded\protected
but the internals of the package will probably be comprimised by the
misuse of (ConTeXt) \unexpanded.
Phelype
On Tue, Jul 7, 2020 at 3:40 PM Jairo A. del Rio
Reading about macro bundles meant to be generic (format agnostic), some of them work in plain/LaTeX, but crash when loaded on ConTeXt. The following happens with xstring.tex
tex error > tex error on line 372 in file xstring.tex: ! Illegal parameter number in definition of \xs_reserved_C
<to be read again>
1
\xs_newlines ->\unexpanded {}\xs_def \xs_arg_i {##1
}
\xs_newmacro_ ...name \xs_myarg }\edef \xs_reserved_C {\unexpanded \expandafter {\xs_newlines
}\edef \noexpand \xs_call }\edef \xs_reserved_D {...
l.372 \xs_newmacro\StrRemoveBraces{}{1}{1}
{%
<empty file>
You meant to type ## instead of #, right? Or maybe a } was forgotten somewhere
earlier, and things are all screwed up? I'm going to assume that you meant ##.
I've tried changing the catcode regime, but with no effect.
Don't misunderstand me. I'm aware of ConTeXt capabilities and string manipulation via Lua. My question is more like: "Why doesn't xstring.tex?"
Sorry if my question is outside the scope of ConTeXt developers/maintainers. Thank you very much.
Jairo :)
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
I've tried with a wrapper and it seems to work fine. However, changing definitions "on the fly" to make xstring usable seems to break things in ConTeXt... Whatever. I guess I will have to find out other command redefinitions in ConTeXt. Thank you very much, Phelype. Jairo :) El mar., 7 de jul. de 2020 a la(s) 13:54, Phelype Oleinik ( phe.h.o1@gmail.com) escribió:
Hi Jairo,
ConTeXt's \unexpanded is e-TeX's \protected, so the error boils down to something like: \edef\x{\unexpanded{#}}, which works in Plain but not in ConTeXt.
Usually packages that claim to be generic have to cope with that. xstring would need to do (in a ConTeXt-specific loader): \let\xstring@unexpanded\normalunexpanded and \let\xstring@unexpanded\unexpanded in Plain and LaTeX loaders, then then use \xstring@unexpanded in the code. But `xstring` doesn't claim (that I found, at least) to be compatible with ConTeXt, so it's understandable: though if it is compatible with Plain, it wouldn't be hard to adapt to ConTeXt.
That said, you can load `xstring` if you do: \let\unexpanded\normalunexpanded \input xstring.tex \let\unexpanded\protected but the internals of the package will probably be comprimised by the misuse of (ConTeXt) \unexpanded.
Phelype
On Tue, Jul 7, 2020 at 3:40 PM Jairo A. del Rio
wrote: Reading about macro bundles meant to be generic (format agnostic), some
of them work in plain/LaTeX, but crash when loaded on ConTeXt. The following happens with xstring.tex
tex error > tex error on line 372 in file xstring.tex: ! Illegal
parameter number in definition of \xs_reserved_C
<to be read again>
1
\xs_newlines ->\unexpanded {}\xs_def \xs_arg_i {##1
}
\xs_newmacro_ ...name \xs_myarg }\edef \xs_reserved_C {\unexpanded
\expandafter {\xs_newlines
}\edef \noexpand \xs_call }\edef \xs_reserved_D {...
l.372 \xs_newmacro\StrRemoveBraces{}{1}{1}
{%
<empty file>
You meant to type ## instead of #, right? Or maybe a } was forgotten
somewhere
earlier, and things are all screwed up? I'm going to assume that you
meant ##.
I've tried changing the catcode regime, but with no effect.
Don't misunderstand me. I'm aware of ConTeXt capabilities and string
manipulation via Lua. My question is more like: "Why doesn't xstring.tex?"
Sorry if my question is outside the scope of ConTeXt
developers/maintainers. Thank you very much.
Jairo :)
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net
___________________________________________________________________________________
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net
___________________________________________________________________________________
Phelype Oleinik schrieb am 07.07.2020 um 20:53:
Hi Jairo,
ConTeXt's \unexpanded is e-TeX's \protected, so the error boils down to something like: \edef\x{\unexpanded{#}}, which works in Plain but not in ConTeXt.
Usually packages that claim to be generic have to cope with that. xstring would need to do (in a ConTeXt-specific loader): \let\xstring@unexpanded\normalunexpanded and \let\xstring@unexpanded\unexpanded in Plain and LaTeX loaders, then then use \xstring@unexpanded in the code. But `xstring` doesn't claim (that I found, at least) to be compatible with ConTeXt, so it's understandable: though if it is compatible with Plain, it wouldn't be hard to adapt to ConTeXt.
That said, you can load `xstring` if you do: \let\unexpanded\normalunexpanded \input xstring.tex \let\unexpanded\protected but the internals of the package will probably be comprimised by the misuse of (ConTeXt) \unexpanded.
Bad idea because ConTeXt also changes the meaning of \protected (you can use \normalprotected to get the primitve). A better version is \pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded Wolfgang
On Tue, Jul 7, 2020 at 5:19 PM Wolfgang Schuster
Bad idea because ConTeXt also changes the meaning of \protected (you can use \normalprotected to get the primitve).
Oops, forgot about that one.
A better version is
\pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded
Nice, didn't know about \push/\popmacro. Thanks! Phelype
Thank, Wolfgang! Both methods work, but both fail with the following example: \pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded \starttext \StrGobbleLeft{bcdef}{4} \stoptext The log says: tex error > tex error on line 6 in file ./tests.tex: ! This can't happen (prefixed command) <argument> \unexpanded { f} \xs_execfirst #1#2->#1 However, some others work. El mar., 7 de jul. de 2020 a la(s) 15:20, Wolfgang Schuster ( wolfgang.schuster.lists@gmail.com) escribió:
Phelype Oleinik schrieb am 07.07.2020 um 20:53:
Hi Jairo,
ConTeXt's \unexpanded is e-TeX's \protected, so the error boils down to something like: \edef\x{\unexpanded{#}}, which works in Plain but not in ConTeXt.
Usually packages that claim to be generic have to cope with that. xstring would need to do (in a ConTeXt-specific loader): \let\xstring@unexpanded\normalunexpanded and \let\xstring@unexpanded\unexpanded in Plain and LaTeX loaders, then then use \xstring@unexpanded in the code. But `xstring` doesn't claim (that I found, at least) to be compatible with ConTeXt, so it's understandable: though if it is compatible with Plain, it wouldn't be hard to adapt to ConTeXt.
That said, you can load `xstring` if you do: \let\unexpanded\normalunexpanded \input xstring.tex \let\unexpanded\protected but the internals of the package will probably be comprimised by the misuse of (ConTeXt) \unexpanded.
Bad idea because ConTeXt also changes the meaning of \protected (you can use \normalprotected to get the primitve).
A better version is
\pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded
Wolfgang
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net
___________________________________________________________________________________
On Tue, Jul 7, 2020 at 6:21 PM Jairo A. del Rio
Thank, Wolfgang! Both methods work, but both fail with the following example:
\pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded \starttext \StrGobbleLeft{bcdef}{4} \stoptext
The log says:
tex error > tex error on line 6 in file ./tests.tex: ! This can't happen (prefixed command)
<argument> \unexpanded {
f}
\xs_execfirst #1#2->#1
However, some others work.
As I said, the internals of `xstring` still use \unexpanded which, after you do \popmacro\unexpanded, will mean e-TeX's \protected, rather than \unexpanded, which are quite different. To be on the safe side, you'd need to wrap every `xstring` command in \pushmacro\unexpanded \let\unexpanded\normalunexpanded <xstring stuff> \popmacro\unexpanded to make sure that \unexpanded means what `xstring` expects. The *proper* way to make `xstring` work in ConTeXt would be something like Circuitikz does: \ifcsname normalunexpanded\endcsname \let\pgfcircutil@unexpanded\normalunexpanded \else \let\pgfcircutil@unexpanded\unexpanded \fi then use \pgfcircutil@unexpanded in the code, which will always have the same meaning. That, of course, requires an update to `xstring`. Phelype
Yep, now it finally works. Certainly it requires a few more lines. I was going to rewrite some TikZ code which was too dependent on LaTeX and xstring was the last stone on the shoe. Thank you a lot, Phelype and Wolfgang (I didn't know about push/popmacro either and now it's in my to-do readings). Jairo :D El mar., 7 de jul. de 2020 a la(s) 16:31, Phelype Oleinik ( phe.h.o1@gmail.com) escribió:
On Tue, Jul 7, 2020 at 6:21 PM Jairo A. del Rio
wrote: Thank, Wolfgang! Both methods work, but both fail with the following
example:
\pushmacro\unexpanded \let\unexpanded\normalunexpanded \input xstring \popmacro\unexpanded \starttext \StrGobbleLeft{bcdef}{4} \stoptext
The log says:
tex error > tex error on line 6 in file ./tests.tex: ! This can't happen
(prefixed command)
<argument> \unexpanded {
f}
\xs_execfirst #1#2->#1
However, some others work.
As I said, the internals of `xstring` still use \unexpanded which, after you do \popmacro\unexpanded, will mean e-TeX's \protected, rather than \unexpanded, which are quite different. To be on the safe side, you'd need to wrap every `xstring` command in \pushmacro\unexpanded \let\unexpanded\normalunexpanded <xstring stuff> \popmacro\unexpanded to make sure that \unexpanded means what `xstring` expects.
The *proper* way to make `xstring` work in ConTeXt would be something like Circuitikz does: \ifcsname normalunexpanded\endcsname \let\pgfcircutil@unexpanded\normalunexpanded \else \let\pgfcircutil@unexpanded\unexpanded \fi then use \pgfcircutil@unexpanded in the code, which will always have the same meaning. That, of course, requires an update to `xstring`.
Phelype
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net
___________________________________________________________________________________
On 7/8/2020 12:00 AM, Jairo A. del Rio wrote:
Yep, now it finally works. Certainly it requires a few more lines. I was going to rewrite some TikZ code which was too dependent on LaTeX and xstring was the last stone on the shoe. Thank you a lot, Phelype and Wolfgang (I didn't know about push/popmacro either and now it's in my to-do readings).
We can have a module that takes care of some things, like \usemodule[system-aliasing] \registeralias\unexpanded\normalunexpanded % preset \registeralias\expanded \normalexpanded % preset \registeraliasfile{rubish.tex} % any file with that name \registeraliasfile{generic/*.tex} % a bit more explicit after which \input rubish.tex \input generic/foo.tex (or whatever way it's loaded) will (hopefully) work ok. But as a module, not in the core, because we don't want additional overhead for third party stuff, but ok on user demand. Of course one cannot expect the context dev to keep a list of files that need such a treatment. Hans
Jairo :D
El mar., 7 de jul. de 2020 a la(s) 16:31, Phelype Oleinik (phe.h.o1@gmail.com mailto:phe.h.o1@gmail.com) escribió:
On Tue, Jul 7, 2020 at 6:21 PM Jairo A. del Rio
mailto:jairoadelrio6@gmail.com> wrote: > > Thank, Wolfgang! Both methods work, but both fail with the following example: > > \pushmacro\unexpanded > \let\unexpanded\normalunexpanded > \input xstring > \popmacro\unexpanded > \starttext > \StrGobbleLeft{bcdef}{4} > \stoptext > > The log says: > > tex error > tex error on line 6 in file ./tests.tex: ! This can't happen (prefixed command) > > > <argument> \unexpanded { > > f} > > \xs_execfirst #1#2->#1 > > However, some others work. As I said, the internals of `xstring` still use \unexpanded which, after you do \popmacro\unexpanded, will mean e-TeX's \protected, rather than \unexpanded, which are quite different. To be on the safe side, you'd need to wrap every `xstring` command in \pushmacro\unexpanded \let\unexpanded\normalunexpanded <xstring stuff> \popmacro\unexpanded to make sure that \unexpanded means what `xstring` expects.
The *proper* way to make `xstring` work in ConTeXt would be something like Circuitikz does: \ifcsname normalunexpanded\endcsname \let\pgfcircutil@unexpanded\normalunexpanded \else \let\pgfcircutil@unexpanded\unexpanded \fi then use \pgfcircutil@unexpanded in the code, which will always have the same meaning. That, of course, requires an update to `xstring`.
Phelype ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl mailto:ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
-- ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Yep, now it finally works. Certainly it requires a few more lines. I was going to rewrite some TikZ code which was too dependent on LaTeX and xstring was the last stone on the shoe. Thank you a lot, Phelype and Wolfgang (I didn't know about push/popmacro either and now it's in my to-do readings). Just wondering ... are there specific low level hel;pers (wrt strings)
On 7/8/2020 12:00 AM, Jairo A. del Rio wrote: that you need in context? Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
participants (4)
-
Hans Hagen
-
Jairo A. del Rio
-
Phelype Oleinik
-
Wolfgang Schuster