ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Taco Hoekwater <taco@elvenkind.com>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: Re: Commands with arguments before in ConTeXt
Date: Mon, 29 Jun 2020 12:36:43 +0200	[thread overview]
Message-ID: <F16B402D-7E92-4F6B-A5BD-B321E0A34B31@elvenkind.com> (raw)
In-Reply-To: <CAKyqqabO-o+XKg_s32pgA2HUvmaaYJR0jb3NtUVf5B3v13KZAg@mail.gmail.com>

Hi,

Oversimplifying: 

TeX (and derivatives like luatex) read the input file as a list of operators with optional suffix arguments.

In normal (text) mode, there is no expression state maintained except inside the handling of such optional arguments. 

It follows that, if there is a top-level text input like

  a\bold{a}

TeX treats this as (assuming ’simple’ macro definitions):
  
  command a     (no arguments)
  command \bold (a macro with one one braced argument)

And by the time “\bold" is seen, the  “a” command has already been processed completely. 


In math mode, there *is* an expression state maintained, and that is why \over and \atop work.


For further information and actual details, you can just look at the luatex source (it is in C):

  https://github.com/TeX-Live/luatex/blob/trunk/source/texk/web2c/luatexdir/tex/maincontrol.c

The function 

  void main_control(void)

is the one that does all the heavy lifting (using a dispatch table).

Taco

> On 29 Jun 2020, at 12:15, Jairo A. del Rio <jairoadelrio6@gmail.com> wrote:
> 
> Hans, after your explanation I'm actually curious now about details, but my knowledge is too limited now (maybe reading source codes would be better? Worse?). I do a bit of C, but I don't know about Pascal at all and I'm not sure where to start from in order to understand TeX better. Well, at least I know why that feature isn't supported. I'll be thankful for any references. Thank you very much.
> 
> Jairo :)
> 
> El lun., 29 de jun. de 2020 a la(s) 02:28, Hans Hagen (j.hagen@xs4all.nl) escribió:
> On 6/28/2020 10:48 PM, Jairo A. del Rio wrote:
> > I've read the following is not possible in TeX
> > 
> > \def#1\macro{blabla#1}
> > 
> > where arguments come before. The only partial exceptions are commands 
> > like \atop or \over, which are in fact primitives. Is there a way to do 
> > this in ConTeXt?
> > 
> > Could it be a feature request for LuaMetaTeX? I've seen Hans 
> > experimenting a lot with new primitives and new possibilities for 
> > arguments, like #0 and co., so I ask in case it's not too nonsensical to 
> > propose it. Regards
> Every \foo will be looked up, so by the time \macro in:
> 
>    bla bla {\bf xxx}\macro{xxx}
> 
> is seen, the {\bf xxx} is already passed and processed. TeX never looks 
> back, which actually would make for a pretty complex multipass parsing 
> and expansion management (forward control and backward: \expandafter 
> would then also have an \expandbefore companion). Even in the simple 
> case: should it keep track of quantities done (grouped, single token, 
> box, etc.) and then in retrospect see it as #1 (them being nodes by now 
> and not tokens)?
> 
> So, why in math but not in text? The \atop and \over (those are 
> basically all the same command but with a different treatment 
> afterwards) are an exception: (1) tex knows that is is in math mode, and 
> in math mode the { } are not really arguments but defines some stuff 
> handled together. Much processing (not all) is delayed to a second pass, 
> so {1}\over{2} internally becomes \over{1}{2} and even that is kind of 
> tricky because there are math styles involved (which makes for some hard 
> coded behaviour that in the perspective of luametatex i try to get more 
> grip on). Now, in order to handle this one (!) exception to lookahead 
> parsing, special tracking happens in math mode, the previous math 
> grouped stuff is registered and adapted to the \over when seen, 
> otherwise it stays as is. This exception also maked the code somewhat 
> messier because there are several spots where it has to be dealt with 
> (also think of saving and restoring states). Just imagine that there 
> were more such commands. Believe me, you really don't want to know the 
> details.
> 
> So the answer is "Can't be done without overhauling the whole concept".
> 
> Now, I know that the narrative is that context is a moving target 
> (contrary to other macro packages that don't / can't change because 
> users / publishers expect them to behave the same forever) so one can 
> argue that for context we can follow a drastic different route, but even 
> then, we can't shoot ourselves in the foot too often. I know that some 
> people (read: Alan) love these {{}\foo{}} syntaxes but live would have 
> been simpler if even \over has not be in there with prefix notation 
> (there is a reason why macro package have \frac like variants).
> 
> 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
> -----------------------------------------------------------------
> ___________________________________________________________________________________
> 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
> ___________________________________________________________________________________

Taco Hoekwater
Elvenkind BV




___________________________________________________________________________________
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
___________________________________________________________________________________

  reply	other threads:[~2020-06-29 10:36 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-28 20:48 Jairo A. del Rio
2020-06-29  7:28 ` Hans Hagen
2020-06-29 10:15   ` Jairo A. del Rio
2020-06-29 10:36     ` Taco Hoekwater [this message]
2020-06-29 11:06       ` Taco Hoekwater
2020-06-29 13:21         ` Hans Hagen
2020-06-30  0:18       ` Jairo A. del Rio
2020-06-29  7:50 ` luigi scarso
2020-06-29 10:21   ` Jairo A. del Rio
2020-06-29 13:27     ` Hans Hagen
2020-06-29 13:48       ` Jairo A. del Rio
2020-06-29 14:45         ` Hans Hagen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=F16B402D-7E92-4F6B-A5BD-B321E0A34B31@elvenkind.com \
    --to=taco@elvenkind.com \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).