[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