LATEX-L Archives

Mailing list for the LaTeX3 project

LATEX-L@LISTSERV.UNI-HEIDELBERG.DE

Options: Use Forum View

Use Proportional Font
Show Text Part by Default
Condense Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Content-transfer-encoding:
8BIT
Sender:
Mailing list for the LaTeX3 project <[log in to unmask]>
Subject:
From:
Morten Høgholm <[log in to unmask]>
Date:
Mon, 26 Apr 2004 12:03:20 +0200
MIME-version:
1.0
Content-type:
text/plain; format=flowed; charset=iso-8859-15
Reply-To:
Mailing list for the LaTeX3 project <[log in to unmask]>
Parts/Attachments:
text/plain (77 lines)
Hi all,

Recently I've been playing with templates and the new internal syntax. One
thing I did think about with the internal syntax was the ability to turn
it off again at will. One reason was that I needed to load amsmath and be
able to pass options to it, so I couldn't say

\ProvidesPackage{test}
\RequirePackage{ldcsetup}
\RequirePackage{amsmath}
\InternalSyntaxOn
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{amsmath}}
\ProcessOptions\relax
\endinput

as this wouldn't pass the options, but instead had to do it with

\ProvidesPackage{test}
\RequirePackage{ldcsetup}
\InternalSyntaxOn
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{amsmath}}
\ProcessOptions\relax
\RequirePackage{amsmath}
\endinput

Unfortunately this results in an infinite loop created by \GenericInfo
 from amstext (\iffirstchoice@ is equal to \iftrue by default and this goes
horribly wrong).

In order to work around this I decided to do things a little differently:

%%%%%%%%%%%
\def\InternalSyntaxError{\errmessage{Invalid use of command}}
\let\InternalSyntaxOff\InternalSyntaxError
\def\InternalSyntaxOn{
   \ifx\InternalSyntaxOff\InternalSyntaxError
     \edef\InternalSyntaxOff{%
       \catcode`\noexpand\~=\the\catcode`\~\relax
       \catcode`\noexpand\ =\the\catcode`\ \relax
       \catcode`\noexpand\^^I=\the\catcode`\^^I\relax
       \catcode`\noexpand\@=\the\catcode`\@\relax
       \catcode`\noexpand\:=\the\catcode`\:\relax
       \catcode`\noexpand\_=\the\catcode`\_\relax
       \endlinechar=\the\endlinechar\relax
       \let\noexpand\InternalSyntaxOff\noexpand\InternalSyntaxError
     }%
     \catcode`\~=10\relax
     \catcode`\ =9\relax
     \catcode`\^^I=9\relax
     \makeatletter
     \catcode`\_=11\relax
     \catcode`\:=11\relax
     \endlinechar=` %
     \relax
   \else
     \InternalSyntaxError
   \fi
}
%%%%%%%%%%%%%%%%%%

This way I got a pair of commands I could use to turn the internal syntax
on and off, sort of like for \makeatletter and \makeatother, only this new
set is able to restore the original meaning of catcodes and provides error
checking, so that you don't put two \InternalSyntaxOn after each other and
similar stupidities. I think the off-switch
     \ifx\InternalSyntaxOff\InternalSyntaxError
     \else
       \InternalSyntaxOff
     \fi
could easily be integrated into \@onefilewithoptions and somewhere in
\document just so that package authors and hackers don't have to remember
to switch it off themselves.

Any comments on this (pros and cons)?
--
Morten Høgholm

ATOM RSS1 RSS2