[TxMt] LaTeX Language Grammar and sub/superscripts
Mike Miller
mightymiller19 at gmail.com
Wed Jul 19 13:37:43 UTC 2006
Thanks very much for your help! I appreciate the detailed explanation.
Mike
On Jul 18, 2006, at 5:23 PM, Charilaos Skiadas wrote:
> On Jul 18, 2006, at 3:33 PM, Mike Miller wrote:
>
>> I am attempting to modify the LaTeX Language Grammar so that I may
>> style superscripts and subscripts distinctly. I tried to add the
>> following:
>> { name = 'constant.superscript.latex';
>> match = '\^(\w{1}|\{.*?\}|\\\w*)';
>> captures = { 1 = { name = 'meta.supersript.latex'; }; };
>> },
>> { name = 'constant.subscript.latex';
>> match = '_(\w{1}|\{.*?\}|\\\w*)';
>> captures = { 1 = { name = 'meta.subscript.latex'; }; };
>> },
>
>> However, when I invoke the "show scope" command in the TextMate
>> bundle, neither of these scopes will appear. (For example, if I
>> type "Suppose that $\{x_n\}$ is a sequence..." and put the caret
>> after the underscore, neither "constant.subscript.latex" nor
>> "meta.subscript.latex" appears in the show scope tooltip.)
>
> Try to have something like that outside of dollar signs. Will it
> match there?
>
> Let me use this opportunity to explain what happens in general. The
> way TextMate matches things is that at each location it goes
> through all the top rules in the LaTeX grammar and tries to match
> the rule starting at each location. If it can't then it moves on.
> Now let's look at the LaTeX grammar for a second. The first
> relevant rules we find are these:
>
> { name = 'string.other.math.latex';
> begin = '\\\(';
> end = '\\\)';
> patterns = ( { include = 'source.math.tex'; } );
> },
> { name = 'string.other.math.latex';
> begin = '\\\[';
> end = '\\\]';
> patterns = ( { include = 'source.math.tex'; } );
> },
>
> These are the ones dealing with other kinds of math environments.
> Since we'll see the same thing with the dollar sign environment in
> a moment, I'll talk about it then.
> The next thing we find is:
>
> { include = 'source.tex'; },
>
> This means that if none of the previous rules has matched, then we
> try all the rules in source.tex. That's the TeX grammar. Let's go
> in there, because that's where the dollar sign rules are:
> { name = 'string.other.math.tex';
> begin = '\$';
> end = '\$';
> swallow = '\\\$';
> patterns = (
> { include = 'source.math.tex'; },
> { include = '$self'; },
> );
> },
>
> This matches a dollar sign until the next unescaped dollar sign
> (the swallow rule takes care of that, an escaped dollar signs will
> be eaten by it. ). Note now the patterns part. This shows *all* the
> things that can match inside the braces. *NO* other rules will
> apply in there. So if your two rules are not matched by what those
> patterns see, then they won't be used.
>
> Now these patterns say that one should include everything from
> source.math.tex. This is the TeX Math grammar, yet another grammar
> in the LaTeX bundle. This is where you should put your additions to
> have them matched inside a math environment. I just tried it, and
> it works just fine. As far as naming goes, this is the standard
> source of information:
> http://macromates.com/textmate/manual/
> language_grammars#naming_conventions
> This would be slightly better when you place in in the TeX Math
> grammar:
>
> { name = 'constant.superscript.math.tex';
> match = '\^(\w{1}|\{.*?\}|\\\w*)';
> captures = { 1 = { name = 'meta.supersript.latex'; }; };
> },
> { name = 'constant.subscript.math.tex';
> match = '_(\w{1}|\{.*?\}|\\\w*)';
> captures = { 1 = { name = 'meta.subscript.latex'; }; };
> },
>
> You could consider the _ and ^ characters as constants, but what
> goes between the braces is certainly not. For instance imagine you
> have:
>
> $x_{\sin(y)}$
>
> You would clearly want to match the \sin part as a function. Your
> method treats everything between the braces in a uniform way. What
> you really want is to use an include command for that part. The way
> to do that is to take the _{} out of the above two rules, and
> create two new rules, that use begin-end together with including
> $self in the patterns.
>
> I hope this is sort of clear, let me know if some part doesn't make
> sense. The LaTeX/TeX/TeXMath grammars are a very good example of
> how things should work, but not very easy for grammar beginners.
>
>> I am new to regular expressions, but if I do a find and replace
>> with those expressions, they do seem to find all occurrences of
>> subscripts and superscripts. I think I probably don't understand
>> the LaTeX language grammar, since I have trouble understanding
>> even the shortest of grammars!
>>
>> Also, are my naming conventions even close to correct?
>>
>> For reference, I'm using TextMate 1.5.2 (r1180) and revision 4405
>> of the LaTeX bundle from the repository.
>>
>> Thanks for your help,
>> Mike Miller
>
> Haris
>
>
>
> ______________________________________________________________________
> For new threads USE THIS: textmate at lists.macromates.com
> (threading gets destroyed and the universe will collapse if you don't)
> http://lists.macromates.com/mailman/listinfo/textmate
More information about the textmate
mailing list