Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by h1439878.stratoserver.net (8.14.2/8.14.2/Debian-2build1) with ESMTP id r447IkAp005415 for ; Sat, 4 May 2013 09:18:47 +0200 Received: from relay.uni-heidelberg.de ([129.206.100.212]) by mx-ha.gmx.net (mxgmx004) with ESMTP (Nemesis) id 0La23x-1U9L0n0tFl-00lkA3 for ; Sat, 04 May 2013 09:18:41 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [129.206.100.94]) by relay.uni-heidelberg.de (8.14.1/8.14.1) with ESMTP id r447Fg31032141 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 4 May 2013 09:15:42 +0200 Received: from listserv.uni-heidelberg.de (listserv.uni-heidelberg.de [127.0.0.1]) by listserv.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id r447FfdP031159; Sat, 4 May 2013 09:15:41 +0200 Received: by LISTSERV.UNI-HEIDELBERG.DE (LISTSERV-TCP/IP release 16.0) with spool id 9299877 for LATEX-L@LISTSERV.UNI-HEIDELBERG.DE; Sat, 4 May 2013 09:15:41 +0200 Received: from relay2.uni-heidelberg.de (relay2.uni-heidelberg.de [129.206.210.211]) by listserv.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id r447FfNU031154 for ; Sat, 4 May 2013 09:15:41 +0200 Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.10]) by relay2.uni-heidelberg.de (8.13.8/8.13.8) with ESMTP id r447F8xo031182 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 4 May 2013 09:15:10 +0200 Received: from mittelbach-online.de (pD9FE3074.dip0.t-ipconnect.de [217.254.48.116]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0LpAdk-1U2TBX2viO-00eq9r; Sat, 04 May 2013 09:15:07 +0200 Received: from [192.168.123.104] (falco [192.168.123.104]) (Authenticated sender: frank) by mittelbach-online.de (Postfix) with ESMTPSA id 3B7052802A3; Sat, 4 May 2013 09:07:56 +0200 (CEST) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130328 Thunderbird/17.0.5 MIME-Version: 1.0 References: <517E353C.5050701@morningstar2.co.uk> <517F75E8.7090900@morningstar2.co.uk> <517F9214.9030103@residenset.net> <517FCFEB.7030007@morningstar2.co.uk> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V02:K0:laUplWxiHV8HJF0InmeFEYhnkhie5APML2xMmi6zpRu nyFaJV8Q9e85Jn84HiwKlp/3k+Mhce0R/b0qrT1KWB0mFMaPlj /qksz/3yUjtubB6kEsObv0PyJM3VJe8H4ucSND9EpJIstxP+zA G+WXlugAxwr1ALnsRgh2BcW8H9oofyLH33Xeqc10M0PiScjIM5 S97PJKhhq7UqiC2c6qm8EJ4VhXXxfVYQWBrLuIm+/wpgXMjq1F kQtN6F+A6Dlm+jQnCxmCr0ykc7KazrrrHKuAJYEpixwOhI3uyl WC7fT8Hy0Ug/E2riQM+cC9O0N3FnaiJrZItmFtOqsUzfP6a5HV nGe2VO6XRgfXKMIYiITkc2oEW7myiHORDQzQKqUUy Message-ID: <5184B578.7080400@latex-project.org> Date: Sat, 4 May 2013 09:15:04 +0200 Reply-To: Mailing list for the LaTeX3 project Sender: Mailing list for the LaTeX3 project From: Frank Mittelbach Subject: Re: Behaviour of \SplitArgument with missing input To: LATEX-L@LISTSERV.UNI-HEIDELBERG.DE In-Reply-To: Precedence: list List-Help: , List-Unsubscribe: List-Subscribe: List-Owner: List-Archive: Envelope-To: X-GMX-Antispam: 0 (Mail was not recognized as spam); Detail=V3; X-GMX-Antivirus: 0 (no virus found) X-UI-Filterresults: notjunk:1;V01:K0:OijQ0Zu6B9M=:I8KOHs8FzKvneDoo+VKb/1 yMVieqpXzVQB4S52Iz+Gcjh7YZPATibPZgxSGYwGrnPpfHan0/e6jpXtZqW/Y6B9Z3M0tHO HQUBv98Jaf0HGpb5tQ+SvZrEJMy/wAUI8PGuZ7NnzuHcLW1+9kwHiomIg+J/U81FnIVMhkv FHX7UHywFtHpEgzLqzI/YBqVG5bLj/nnc3XCVVTUUn3E0vWLpszFUZA48lvb+ay+M1lL+sx ubh7iyebbxvXCensO5f3SM9P43Ua/Xmddil4F2ZNvU35Nzs7Ija7YXfl9XIg+cE8/wiQPCW RMj5mCTFwWJpQ5qRjQqBQlUL4+BA5EbukT2zhgMsQVU9FxXU0qe4qjfnLCD0PFSO5+2anF3 qRBPxvzNNqTaJNNl8TqOSZEC48pKKn9JJAUeJVVFQEyB52D1em3Qrsy6v5tyTPvoh87+ToT KASKwHsz5a5GJPYQv3jLYyFvba80u0gPDKNpAqQPtQ3rq4patNVZw1/eut7V6nTIq/6XRTq um5S8FGFS5h4hY4xeC5g9A0VEnvCawKa2xawO7vQk5WcpJIsaKExp6GhmYbFMdNosPaFJH7 gzxMqEsX2jQmIJ9GhtpzixbmCoklb+3/bsdcN19KhMrsBH95Whmc67/8GmbDaGq9bht/G/R dCKOf/XCd0iDwJBOhtUsxI1kpGB4CpC5QAbxLSoPTNKLINS0KrWDpaWZxjjC6oPu9zgXz5l vKGaoXGVFZHzgvVB2tdSEm3Zk2BNtqCuqMnvi4DDWd8LeyM/+aMmpwZw6MSbqy662aZm7Sg gnamXRd0h2ec6502f0ZIYM7bpWVTd8u7ZvAedvajtFtStIKaeYNKxn7VLglI4a+vTUG3wup BLgSZxNJHlFPFMgM1nkFHcIKMvqIm0gykCwFUdkU5Ppoj3rHggnOlMCS9JAiQcwUBo6xADP 96MQjv0Iqt3bOJ/V3NPjQSAw8vEZRNgc13mftWL7IbzZXcs6eEKPMmSOY81kdcrHUkxVJDR B65/J8UJVwhfdCJh3Gwtp4OHNSb7V/faHh5DOGK6bx62AT+PpC4LAFgop6LiKtwNKeB4Uua ItbS2gRRj3zm9hekuXOfVoiwLlch7uYnnA2MkCKJzD/FI9IeibZpENk6NbBNNTaidWNozqT 91ugwQebrQRYSggpNYbtEs/0pgfBHFfhDY/6aVVbkMykq2uZ6H1RfE8vxGzdIkDoCw0bGP3 6+n2i+CwaispRf7GyPZfDMWmnuq2jeIbg2fH7SUEp1M6wD4yC72f15Lp92f8E/OdzvkAITO eI8mrrTvomjS9hNAT9libkoCWiIF29q6Ezg3N2oPossOflMUVr8fINIy1oNZIUFUUwMEbjG nZSrtWfSSGKSoXhddqJYXr5SefttnvJwxuyIJGt4lolkNEZ3uqYMABa1aSGS2wu62TmW7uM H4H9Cj5gpTLyloKDrzUagPkMCAIoa4dAmstpXy6kEv9gmIP2qJvNeYmpFMXF7eB1oXPhrxk C3GIpH+F0AVjHJdD8Kw0+x1zYUqBJjNCFz2jQtuhMYjYTrmzAXs8WyLuWLArA1xAm6yiG11 OJRUMMMR0rxaTNIJcOi2p93zQL5fCUivolZsLiLjOVW+jEL5bj0er4DcZ8Q= X-UI-Loop:V01:+EI2ZsPKATk=:VMv0kcJUBZKuiMT6xHC9yk4nRBMIhcwRSkkkwNoqvPg= Status: R X-Status: X-Keywords: X-UID: 7202 Am 30.04.2013 19:20, schrieb Michiel Helvensteijn: > On Tue, Apr 30, 2013 at 4:06 PM, Joseph Wright > wrote: > >> On where '-NoValue-' 'lives', ...etc... > > Your problem is that xparse has been trying to cater to two different > target groups. It's meant to create document-level commands. But it's > not clear what kind of environment it's meant to create them from. you hit the nail on its head (or whatever the phrase might be :-) on one hand xparse has taken a life on its own (because of being very useful in 2e context) and on the other hand the middle glue didn't got finished so far and thus the two went of (partly at least) in different directions. Conceptually what sits in the middle is what I call typesetting elements. Those have a type/signature which is a bunch of inputs with some defined semantics (and such semantics could and should include that such objects be optional). So that layer should provide a way to say: I expect some optional input, provide me with data or tell me that nothing is coming. The task of the interface layer (of which xparse would be one flavor) would then be to translate the user interface (e.g., brackets, stars, what have you) into the syntax of the class design layer. A big point to note here (for me at least) is that therefore it should certainly not be \xparse_if_no_value:nTF because it is not an xparse concept needed on the lower level, it is a core concept "from" the lower level. If somebody writes an xhtml.sty interface that provides html like syntax for the same typesetting elements those translation would need to result in the same calls to the class design layer eventually. What I originally thought was that this class design layer is being essentially described by the concepts of xtemplate (only that I do believe that we didn't quite got that right, first time around, so these days I consider xtemplate only a prototype that needs redoing). So in a nutshell, the somewhat naive version of the interface was supposed to look like \DeclareDocumentcommand \foo { } { \UseTemplate... } Instead what we have now is \DeclareDocumentcommand \foo { } { bunch of low-level expl3 code and/or 2e code and possible some xparse parsing control code such as \IfNoValueTF and the like } so ... > On the one hand, the LaTeX3 methodology recommends the use of xparse > for document level commands (rather than the LaTeX2 \newcommand or the > TeX \def). On the other hand, xparse doesn't offer a LaTeX3 syntax! It > was obviously designed to be used independently from expl3. I do > understand. The xparse functionality is useful to both LaTeX3 > programmers and other LaTeXers. it wasn't designed to be independent of LaTeX3 syntax, but it was designed to be independent of expl3 syntax (and in my opinion still should) > As I see it, the 'correct' way to go about this is to follow your own > methodology (I'm a fan of self-reference): > > * Create a LaTeX3 library which provides xparse functionality; let's > call it l3xparse. I'd expect to see functions like > \xparse_new_document_command:Nnn, \xparse_split_argument:nn, > \xparse_if_no_value:n(TF). Actually, a lot of potential \xparse_... > functions probably already exist under a different name, like > \bool_if:n(TF) for \IfBoolean(TF). > > * Expose l3xparse with a thin layer of document-level commands. The > result will be what you now call xparse. The cool thing is, you can > actually use l3xparse to create that thin layer around itself. I agree that there should be an l3UIfoundation library that provides functions for splitting etc etc as they would be useful not just for implementing xparse but also for parsing other syntax schemes but it doesn't resolve the issue that there has to be that middle layer (eventually) and that middle layer should not be expl3 code If this middle layer is not provided then in my opinion that would get us back to mix and match of class design of 2e where a lot of the "design" got buried into coding rather than cleanly decoupled. That l3UIfundation would then also be the place that holds \uif_if_no_value:nTF that could be used to implement the current xparse \IfNoValueTF (which I never like to be there really :-) or directly used in expl3 code in the command body as long as there is not middle layer worth talking about. And eventually it would be used inside the code that makes up the middle layer. My view of the world (in pictures): Logical view architecture: https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/Logical%20View.png Document class architecture: https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/document%20class%20architecture%20%28layers%29.png list element example: https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/list%20example%202.png regards frank