vardef with @# not working within context
Hi all, I've been fiddling around with metaobj a bit, but defining my own objects failed. After some debugging, I've reduced this to a metapost / context MkIV issue (so no metaobj specifics anymore). What happens, is that vardefs that use @# as a placeholder in their name only work when they are defined in an external .mp file. When I define them inside context (\startMPcode or \startMPinclusions), I get funny errors (mostly "Isolated expression", which seems to mean that the macro is not defined). I suspect this is because the way context extracts metapost code. Is this a fundamental problem, or could it be fixed? The following context file will easily reproduce the problem: \starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo; vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext Running this file gives the following (first) error: mplib | mp terminal: >> xy0mm ! Improper `addto'. To illustrate that this is specific to the use of @#, I've included the foo vardef which does work properly. When I move the vardef xy.. line to a separate file, say foo.mp, and replace it with "input foo;", the errors disappear. Gr. Matthijs
On Mon, 21 Sep 2009, Matthijs Kooijman wrote:
Hi all,
I've been fiddling around with metaobj a bit, but defining my own objects failed. After some debugging, I've reduced this to a metapost / context MkIV issue (so no metaobj specifics anymore).
What happens, is that vardefs that use @# as a placeholder in their name only work when they are defined in an external .mp file. When I define them inside context (\startMPcode or \startMPinclusions), I get funny errors (mostly "Isolated expression", which seems to mean that the macro is not defined).
I suspect this is because the way context extracts metapost code. Is this a fundamental problem, or could it be fixed?
You need to escape # inside any \startMPwhatever...\stopMPwhatever. This has to do with the fact that TeX processes the contents before they are passed to metapost, and TeX does not like isolated #. Try replacing # with \# or \string# Hans, does it make sense to parse all MP environments (ironically except \startMPenvironment, but that is almost redundant in MKIV) with a separate catcode regime where # has catcode other. After all, it is highly unlikely that anyone will define a TeX maco inside \startMPcode or \startMPinclusions. Aditya
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Matthijs Kooijman wrote:
Hi all,
I've been fiddling around with metaobj a bit, but defining my own objects failed. After some debugging, I've reduced this to a metapost / context MkIV issue (so no metaobj specifics anymore).
What happens, is that vardefs that use @# as a placeholder in their name only work when they are defined in an external .mp file. When I define them inside context (\startMPcode or \startMPinclusions), I get funny errors (mostly "Isolated expression", which seems to mean that the macro is not defined).
I suspect this is because the way context extracts metapost code. Is this a fundamental problem, or could it be fixed?
You need to escape # inside any \startMPwhatever...\stopMPwhatever. This has to do with the fact that TeX processes the contents before they are passed to metapost, and TeX does not like isolated #. Try replacing # with \# or \string#
it's more that tex likes to duplicate the # internally
Hans, does it make sense to parse all MP environments (ironically except \startMPenvironment, but that is almost redundant in MKIV) with a separate catcode regime where # has catcode other. After all, it is highly unlikely that anyone will define a TeX maco inside \startMPcode or \startMPinclusions.
how about adding let @## = @# ; to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii) seems to work Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Mon, 21 Sep 2009, Hans Hagen wrote:
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii)
seems to work
Works in mkiv, but in mkii I get an error with \starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo; vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext ! Illegal parameter number in definition of \@MPG@@@. <to be read again> vardef xy@## .m,10mm); enddef; draw ... = (@##,@##) enddef ; \dodostartuseMPgraphic ...useMPgraphic {#1}{#2}{#3 }}\elabelgroup \dostartMPcode ...graphic {@@}#1\stopuseMPgraphic \useMPgraphic {@@}\endgroup l.9 \stopMPcode Aditya
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii)
seems to work
Works in mkiv, but in mkii I get an error with
\starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo;
vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext
! Illegal parameter number in definition of \@MPG@@@. <to be read again>
hm, weird. did you remake the metafun format? ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Mon, 21 Sep 2009, Hans Hagen wrote:
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii)
seems to work
Works in mkiv, but in mkii I get an error with
\starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo;
vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext
! Illegal parameter number in definition of \@MPG@@@. <to be read again>
hm, weird. did you remake the metafun format?
I did. Just to verify, I created an mp file beginfig(1) ; vardef xy@## = (@##,@##) enddef ; draw xy0mm -- xy10mm; endfig; end; and ran mpost -progname=metafun test.mp which gives me the correct output, so @## is defined. I am using 2009.09.18. I'll try later with the latest beta. Aditya
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii)
seems to work
Works in mkiv, but in mkii I get an error with
\starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo;
vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext
! Illegal parameter number in definition of \@MPG@@@. <to be read again>
hm, weird. did you remake the metafun format?
I did. Just to verify, I created an mp file
beginfig(1) ; vardef xy@## = (@##,@##) enddef ; draw xy0mm -- xy10mm; endfig; end;
and ran mpost -progname=metafun test.mp which gives me the correct output, so @## is defined. I am using 2009.09.18. I'll try later with the latest beta.
in supp-mps.mkii, patch: \long\def\runtimeobeyMPlines {\catcode35=11\relax % goodie \ifx\rawcharacter\undefined better than nothing ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Mon, 21 Sep 2009, Hans Hagen wrote:
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
Aditya Mahajan wrote:
On Mon, 21 Sep 2009, Hans Hagen wrote:
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii)
seems to work
Works in mkiv, but in mkii I get an error with
\starttext \startMPcode vardef foo = draw (0mm,0mm)--(10mm,10mm); enddef; foo;
vardef xy@# = (@#,@#) enddef ; draw xy0mm -- xy10mm; \stopMPcode \stoptext
! Illegal parameter number in definition of \@MPG@@@. <to be read again>
hm, weird. did you remake the metafun format?
I did. Just to verify, I created an mp file
beginfig(1) ; vardef xy@## = (@##,@##) enddef ; draw xy0mm -- xy10mm; endfig; end;
and ran mpost -progname=metafun test.mp which gives me the correct output, so @## is defined. I am using 2009.09.18. I'll try later with the latest beta.
in supp-mps.mkii, patch:
\long\def\runtimeobeyMPlines {\catcode35=11\relax % goodie \ifx\rawcharacter\undefined
better than nothing
This works. Aditya
Hi Hans,
it's more that tex likes to duplicate the # internally Ah, yes, I've seen some mentions on @## in error messages, but I thought that was just part of the way metapost handled @#. Apparently not :-)
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii) This worked for me in MkIV. Will this be included in the next beta?
Gr. Matthijs
Matthijs Kooijman wrote:
Hi Hans,
it's more that tex likes to duplicate the # internally Ah, yes, I've seen some mentions on @## in error messages, but I thought that was just part of the way metapost handled @#. Apparently not :-)
how about adding
let @## = @# ;
to mp-tool.mp (you need to remake the context format in mkiv or the metafun format in mkii) This worked for me in MkIV. Will this be included in the next beta?
sure ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
participants (3)
-
Aditya Mahajan
-
Hans Hagen
-
Matthijs Kooijman