ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* \doifnextcharelse problem
@ 2004-02-26 16:38 Nikolai Weibull
  2004-02-26 18:00 ` Hans Hagen
  0 siblings, 1 reply; 4+ messages in thread
From: Nikolai Weibull @ 2004-02-26 16:38 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 1859 bytes --]

It seems that I can't get \definecomplexorsimpleempty to work right.
The command I define works fine unless the simple version is called, in
which case the first character in the body of the command is checked
\doifnextcharelse[... which thus fails but in some manner eats it (even
though it is output).  The problem with the \doifnextcharelse is that
the character it checks against is \catcode'd to \@@active, but it won't
work when the character has been checked.  Is there any way to fix this?

I understand if my problem isn't that clear, so I've attached the module.
The idea is to be able to write
  \startbnfgrammar
    <exp>: <num>.
    <num>: "0";"1".
  \stopbnfgrammar
and this is then typeset as a table, but currently you're forced to write
  \startbnfgrammar[]
    <exp>: <num>.
    <num>: "0";"1".
  \stopbnfgrammar
or the first < in <exp> gets eaten by \doifnextcharelse and the
\def<{... won't be called causing problems down the line when the > is
encountered, which expands into a \egroup which stops tex as there is no
matching \bgroup.  Now, is there any way to get \doifnextcharelse to
properly deal with \catcode'd characters (such as my <) that it
encounters when looking for other characters (such as the [ for optional
arguments to commands)?  I'd really like to resolve this, so any
comments or tips are appreciated.

Second, is there any good reference to programming TeX?  I mean, one can
figure out most stuff from reading CONTEXT's source for example, but it
would be great to find out the exact implications of builtins such as
\relax and so on.
	nikolai

--
::: name: Nikolai Weibull    :: aliases: pcp / lone-star / aka :::
::: born: Chicago, IL USA    :: loc atm: Gothenburg, Sweden    :::
::: page: www.pcppopper.org  :: fun atm: gf,lps,ruby,lisp,war3 :::
main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}

[-- Attachment #2: m-bnf.tex --]
[-- Type: application/x-tex, Size: 4150 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: \doifnextcharelse problem
  2004-02-26 16:38 \doifnextcharelse problem Nikolai Weibull
@ 2004-02-26 18:00 ` Hans Hagen
  2004-02-26 19:05   ` Nikolai Weibull
  0 siblings, 1 reply; 4+ messages in thread
From: Hans Hagen @ 2004-02-26 18:00 UTC (permalink / raw)


At 17:38 26/02/2004, you wrote:

>which case the first character in the body of the command is checked
>\doifnextcharelse[... which thus fails but in some manner eats it (even

tricky indeed (will think about it)

go the etex way:

\definecomplexorsimpleempty\startbnfgrammar

\long\def\complexstartbnfgrammar[#1]#2\stopbnfgrammar
   {\bgroup%
    \global\firstruletrue%
    \global\newruletrue%
    \global\donerulefalse%
    \setupbnfgrammar[#1]%
    \setcatcodes%
    \starttable[|r|c|l|]\scantokens{#2}\LR\stoptable
    \egroup}

beware, use

\def\BNFsomecommand

to avoid future nameclashes; also, no % are needed after a \cs:

\long\def\complexstartbnfgrammar[#1]#2\stopbnfgrammar
   {\bgroup
    \global\firstruletrue
    \global\newruletrue
    \global\donerulefalse
    \setupbnfgrammar[#1]%
    \setcatcodes
    \starttable[|r|c|l|]\scantokens{#2}\LR\stoptable
    \egroup}

I assume that you know that \setcatcodes is an internal command

Hans  

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: \doifnextcharelse problem
  2004-02-26 18:00 ` Hans Hagen
@ 2004-02-26 19:05   ` Nikolai Weibull
  2004-02-27  7:53     ` Hans Hagen
  0 siblings, 1 reply; 4+ messages in thread
From: Nikolai Weibull @ 2004-02-26 19:05 UTC (permalink / raw)


* Hans Hagen <pragma@wxs.nl> [Feb 26, 2004 19:10]:
> go the etex way:

great!  thanks, that worked.

> no % are needed after a \cs:

hm, OK.  This is a good reason why it would be good to have a tex
programming reference, so that one'd know when it's necessary and when
it's not.

> I assume that you know that \setcatcodes is an internal command

yeah, I saw it somewhere.  I figured that it was a good name though and
that I'd use it too.  I figured that the \unprotect deal with the
nameclash.  Am I, in fact, overruling the internal one now?  If so, how
should one avoid cases like this?  Should I have all my module's
commands CamelCased?

Also, is there some repository of CONTEXT modules out there?  I can't
find a reference on pragma-ade.com nor ntg.nl, but maybe I've missed it.
Anyway, thanks Hans for such a quick and thorough response, and also for
a great typesetting environment; TeX has never been easier,
	nikolai

--
::: name: Nikolai Weibull    :: aliases: pcp / lone-star / aka :::
::: born: Chicago, IL USA    :: loc atm: Gothenburg, Sweden    :::
::: page: www.pcppopper.org  :: fun atm: gf,lps,ruby,lisp,war3 :::
main(){printf(&linux["\021%six\012\0"],(linux)["have"]+"fun"-97);}

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: \doifnextcharelse problem
  2004-02-26 19:05   ` Nikolai Weibull
@ 2004-02-27  7:53     ` Hans Hagen
  0 siblings, 0 replies; 4+ messages in thread
From: Hans Hagen @ 2004-02-27  7:53 UTC (permalink / raw)


At 20:05 26/02/2004, you wrote:

>commands CamelCased?

For third party extensions:

   - low level: \BNFsomething
   - high level: whatever you want (often the start/setup will not clash 
that much, maybe we need to setup a registration system)

for macros in documents:

   - \CamelCased

is fine

Hans  

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-02-27  7:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-02-26 16:38 \doifnextcharelse problem Nikolai Weibull
2004-02-26 18:00 ` Hans Hagen
2004-02-26 19:05   ` Nikolai Weibull
2004-02-27  7:53     ` Hans Hagen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).