xref: /vim-8.2.3635/runtime/syntax/tex.vim (revision dfccaf0f)
1" Vim syntax file
2" Language:	TeX
3" Maintainer:	Dr. Charles E. Campbell, Jr. <[email protected]>
4" Last Change:	Oct 13, 2004
5" Version:	26
6" URL:		http://www.erols.com/astronaut/vim/index.html#vimlinks_syntax
7"
8" Notes: {{{1
9"
10" 1. If you have a \begin{verbatim} that appears to overrun its boundaries,
11"    use %stopzone.
12"
13" 2. Run-on equations ($..$ and $$..$$, particularly) can also be stopped
14"    by suitable use of %stopzone.
15"
16" 3. If you have a slow computer, you may wish to modify
17"
18"	syn sync maxlines=200
19"	syn sync minlines=50
20"
21"    to values that are more to your liking.
22"
23" 4. There is no match-syncing for $...$ and $$...$$; hence large
24"    equation blocks constructed that way may exhibit syncing problems.
25"    (there's no difference between begin/end patterns)
26"
27" 5. If you have the variable "g:tex_no_error" defined then none of the
28"    lexical error-checking will be done.
29"
30"    ie. let g:tex_no_error=1
31
32" Version Clears: {{{1
33" For version 5.x: Clear all syntax items
34" For version 6.x: Quit when a syntax file was already loaded
35if version < 600
36  syntax clear
37elseif exists("b:current_syntax")
38  finish
39endif
40
41" Define the default highlighting. {{{1
42" For version 5.7 and earlier: only when not done already
43" For version 5.8 and later: only when an item doesn't have highlighting yet
44if version >= 508 || !exists("did_tex_syntax_inits")
45 let did_tex_syntax_inits = 1
46 if version < 508
47  command -nargs=+ HiLink hi link <args>
48 else
49  command -nargs=+ HiLink hi def link <args>
50 endif
51endif
52if exists("g:tex_tex") && !exists("g:tex_no_error")
53 let g:tex_no_error= 1
54endif
55
56" Determine whether or not to use "*.sty" mode
57" The user may override the normal determination by setting
58"   g:tex_stylish to 1      (for    "*.sty" mode)
59"    or to           0 else (normal "*.tex" mode)
60" or on a buffer-by-buffer basis with b:tex_stylish
61let b:extfname=expand("%:e")
62if exists("g:tex_stylish")
63 let b:tex_stylish= g:tex_stylish
64elseif !exists("b:tex_stylish")
65 if b:extfname == "sty" || b:extfname == "cls" || b:extfname == "clo" || b:extfname == "dtx" || b:extfname == "ltx"
66  let b:tex_stylish= 1
67 else
68  let b:tex_stylish= 0
69 endif
70endif
71
72" (La)TeX keywords: only use the letters a-zA-Z {{{1
73" but _ is the only one that causes problems.
74if version < 600
75  set isk-=_
76  if b:tex_stylish
77    set isk+=@
78  endif
79else
80  setlocal isk-=_
81  if b:tex_stylish
82    setlocal isk+=@
83  endif
84endif
85
86" Clusters: {{{1
87" --------
88syn cluster texCmdGroup		contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSectionMarker,texSectionName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle
89if !exists("g:tex_no_error")
90 syn cluster texCmdGroup	add=texMathError
91endif
92syn cluster texEnvGroup		contains=texMatcher,texMathDelim,texSpecialChar,texStatement
93syn cluster texMatchGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption
94syn cluster texRefGroup		contains=texMatcher,texComment,texDelimiter
95if !exists("tex_no_math")
96 syn cluster texMathZones	contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
97 syn cluster texMatchGroup	add=@texMathZones
98 syn cluster texMathDelimGroup	contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2
99 syn cluster texMathMatchGroup	contains=@texMathZones,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathMatcher,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone
100 syn cluster texMathZoneGroup	contains=texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle
101 if !exists("g:tex_no_error")
102  syn cluster texMathMatchGroup	add=texMathError
103  syn cluster texMathZoneGroup	add=texMathError
104 endif
105endif
106
107" Try to flag {} and () mismatches: {{{1
108if !exists("g:tex_no_error")
109 syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texMatchGroup,texError
110 syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texMatchGroup,texError
111else
112 syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texMatchGroup
113 syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texMatchGroup
114endif
115syn region texParen		start="("						end=")"		contains=@texMatchGroup,@Spell
116if !exists("g:tex_no_error")
117 syn match  texError		"[}\])]"
118endif
119if !exists("tex_no_math")
120 if !exists("g:tex_no_error")
121  syn match  texMathError	"}"	contained
122 endif
123 syn region texMathMatcher	matchgroup=Delimiter start="{"  skip="\\\\\|\\}"  end="}" end="%stopzone\>" contained contains=@texMathMatchGroup
124endif
125
126" TeX/LaTeX keywords: {{{1
127" Instead of trying to be All Knowing, I just match \..alphameric..
128" Note that *.tex files may not have "@" in their \commands
129if exists("g:tex_tex") || b:tex_stylish
130  syn match texStatement	"\\[a-zA-Z@]\+"
131else
132  syn match texStatement	"\\\a\+"
133  if !exists("g:tex_no_error")
134   syn match texError		"\\\a*@[a-zA-Z@]*"
135  endif
136endif
137
138" TeX/LaTeX delimiters: {{{1
139syn match texDelimiter		"&"
140syn match texDelimiter		"\\\\"
141
142" Tex/Latex Options: {{{1
143syn match texOption	"[^\\]\zs#\d\+\|^#\d\+"
144
145" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
146if b:tex_stylish
147  syn match texAccent		"\\[bcdvuH][^a-zA-Z@]"me=e-1
148  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
149else
150  syn match texAccent		"\\[bcdvuH]\A"me=e-1
151  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
152endif
153syn match texAccent		"\\[bcdvuH]$"
154syn match texAccent		+\\[=^.\~"`']+
155syn match texAccent		+\\['=t'.c^ud"vb~Hr]{\a}+
156syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
157
158" \begin{}/\end{} section markers: {{{1
159syn match  texSectionMarker	"\\begin\>\|\\end\>" nextgroup=texSectionName
160syn region texSectionName	matchgroup=Delimiter start="{" end="}"  contained nextgroup=texSectionModifier
161syn region texSectionModifier	matchgroup=Delimiter start="\[" end="]" contained
162
163" \documentclass, \documentstyle, \usepackage: {{{1
164syn match  texDocType		"\\documentclass\>\|\\documentstyle\>\|\\usepackage\>"	nextgroup=texSectionName,texDocTypeArgs
165syn region texDocTypeArgs	matchgroup=Delimiter start="\[" end="]"			contained	nextgroup=texSectionName
166
167" TeX input: {{{1
168syn match texInput		"\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7				contains=texStatement
169syn match texInputFile		"\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}"	contains=texStatement,texInputCurlies
170syn match texInputFile		"\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"		contains=texStatement,texInputCurlies,texInputFileOpt
171syn match texInputCurlies	"[{}]"								contained
172syn region texInputFileOpt	matchgroup=Delimiter start="\[" end="\]"			contained
173
174" Type Styles (LaTeX 2.09): {{{1
175syn match texTypeStyle		"\\rm\>"
176syn match texTypeStyle		"\\em\>"
177syn match texTypeStyle		"\\bf\>"
178syn match texTypeStyle		"\\it\>"
179syn match texTypeStyle		"\\sl\>"
180syn match texTypeStyle		"\\sf\>"
181syn match texTypeStyle		"\\sc\>"
182syn match texTypeStyle		"\\tt\>"
183
184" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
185syn match texTypeStyle		"\\textbf\>"
186syn match texTypeStyle		"\\textit\>"
187syn match texTypeStyle		"\\textmd\>"
188syn match texTypeStyle		"\\textrm\>"
189syn match texTypeStyle		"\\textsc\>"
190syn match texTypeStyle		"\\textsf\>"
191syn match texTypeStyle		"\\textsl\>"
192syn match texTypeStyle		"\\texttt\>"
193syn match texTypeStyle		"\\textup\>"
194syn match texTypeStyle		"\\emph\>"
195
196syn match texTypeStyle		"\\mathbb\>"
197syn match texTypeStyle		"\\mathbf\>"
198syn match texTypeStyle		"\\mathcal\>"
199syn match texTypeStyle		"\\mathfrak\>"
200syn match texTypeStyle		"\\mathit\>"
201syn match texTypeStyle		"\\mathnormal\>"
202syn match texTypeStyle		"\\mathrm\>"
203syn match texTypeStyle		"\\mathsf\>"
204syn match texTypeStyle		"\\mathtt\>"
205
206syn match texTypeStyle		"\\rmfamily\>"
207syn match texTypeStyle		"\\sffamily\>"
208syn match texTypeStyle		"\\ttfamily\>"
209
210syn match texTypeStyle		"\\itshape\>"
211syn match texTypeStyle		"\\scshape\>"
212syn match texTypeStyle		"\\slshape\>"
213syn match texTypeStyle		"\\upshape\>"
214
215syn match texTypeStyle		"\\bfseries\>"
216syn match texTypeStyle		"\\mdseries\>"
217
218" Some type sizes: {{{1
219syn match texTypeSize		"\\tiny\>"
220syn match texTypeSize		"\\scriptsize\>"
221syn match texTypeSize		"\\footnotesize\>"
222syn match texTypeSize		"\\small\>"
223syn match texTypeSize		"\\normalsize\>"
224syn match texTypeSize		"\\large\>"
225syn match texTypeSize		"\\Large\>"
226syn match texTypeSize		"\\LARGE\>"
227syn match texTypeSize		"\\huge\>"
228syn match texTypeSize		"\\Huge\>"
229
230" Spacecodes (TeX'isms): {{{1
231" \mathcode`\^^@="2201  \delcode`\(="028300  \sfcode`\)=0 \uccode`X=`X  \lccode`x=`x
232syn match texSpaceCode		"\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
233syn match texSpaceCodeChar    "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)"	contained
234
235" Sections, subsections, etc: {{{1
236if exists("tex_dosynfolds") && has("folding")
237 " COMBAK -- this folding doesn't work as expected as yet
238 syn region Red	matchgroup=texSection start="\\section\*\=\>"			end="\\\%(sub\)*\%(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>"me=s end="%\s*stopzone\>" fold
239" syn region Red	matchgroup=texSection start="\\section\*\=\>"			end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" end="%\s*stopzone\>" contains=TOP fold
240" syn region Blue	matchgroup=texSection start="\\subsection\*\=\>"		end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
241" syn region texSectionZone	matchgroup=texSection start="\\subsubsection\*\=\>"		end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
242" syn region texSectionZone	matchgroup=texSection start="\\title\*\=\>"			end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
243" syn region texSectionZone	matchgroup=texSection start="\\author\*\=\>"			end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
244" syn region texSectionZone	matchgroup=texSection start="\\part\*\=\>"			end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
245" syn region texSectionZone	matchgroup=texSection start="\\chapter\*\=\>"			end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
246" syn region texSectionZone	matchgroup=texSection start="\\paragraph\*\=\>"		end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
247" syn region texSectionZone	matchgroup=texSection start="\\subparagraph\*\=\>"		end="\ze\\\(sub\)*\(abstract\|section\|author\|part\|chapter\|paragraph\|subparagraph\)\*\=\>" contains=TOP fold
248" syn region texSectionZone	matchgroup=texSection start="\\begin\s*{\s*abstract\s*}"	end="\\end\s*{\s*abstract\s*}"  contains=TOP fold
249else
250 syn match texSection		"\\\(sub\)*section\*\=\>"
251 syn match texSection		"\\\(title\|author\|part\|chapter\|paragraph\|subparagraph\)\>"
252 syn match texSection		"\\begin\s*{\s*abstract\s*}\|\\end\s*{\s*abstract\s*}"
253endif
254
255" Bad Math (mismatched): {{{1
256if !exists("tex_no_math")
257 syn match texBadMath		"\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
258 syn match texBadMath		"\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
259 syn match texBadMath		"\\[\])]"
260endif
261
262" Math Zones: {{{1
263if !exists("tex_no_math")
264 " TexNewMathZone: creates a mathzone with the given suffix and mathzone name. {{{2
265 "                 Starred forms are created if starform is true.  Starred
266 "                 forms have syntax group and synchronization groups with a
267 "                 "S" appended.  Handles: cluster, syntax, sync, and HiLink.
268 fun! TexNewMathZone(sfx,mathzone,starform)
269   let grpname  = "texMathZone".a:sfx
270   let syncname = "texSyncMathZone".a:sfx
271   exe "syn cluster texMathZones add=".grpname
272   exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'
273   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
274   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
275   exe 'HiLink '.grpname.' texMath'
276   if a:starform
277    let grpname  = "texMathZone".a:sfx.'S'
278    let syncname = "texSyncMathZone".a:sfx.'S'
279    exe "syn cluster texMathZones add=".grpname
280    exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'
281    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
282    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
283    exe 'HiLink '.grpname.' texMath'
284   endif
285 endfun
286
287 " Standard Math Zones: {{{2
288 call TexNewMathZone("A","align",1)
289 call TexNewMathZone("B","alignat",1)
290 call TexNewMathZone("C","displaymath",1)
291 call TexNewMathZone("D","eqnarray",1)
292 call TexNewMathZone("E","equation",1)
293 call TexNewMathZone("F","flalign",1)
294 call TexNewMathZone("G","gather",1)
295 call TexNewMathZone("H","math",1)
296 call TexNewMathZone("I","multline",1)
297 call TexNewMathZone("J","subequations",0)
298 call TexNewMathZone("K","xalignat",1)
299 call TexNewMathZone("L","xxalignat",0)
300
301 " Inline Math Zones: {{{2
302 syn region texMathZoneV	matchgroup=Delimiter start="\\("	matchgroup=Delimiter end="\\)\|%stopzone\>"	keepend contains=@texMathZoneGroup
303 syn region texMathZoneW	matchgroup=Delimiter start="\\\["	matchgroup=Delimiter end="\\]\|%stopzone\>"	keepend contains=@texMathZoneGroup
304 syn region texMathZoneX	matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>"	contains=@texMathZoneGroup
305 syn region texMathZoneY	matchgroup=Delimiter start="\$\$" matchgroup=Delimiter end="\$\$" end="%stopzone\>"	keepend		contains=@texMathZoneGroup
306 syn region texMathZoneZ	matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>"	contains=@texMathZoneGroup
307
308 syn match texMathOper		"[_^=]" contained
309
310 " \left..something.. and \right..something.. support: {{{2
311 syn match   texMathDelimBad	contained		"\S"
312 syn match   texMathDelim	contained		"\\\(left\|right\|[bB]igg\=[lr]\)\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
313 syn match   texMathDelim	contained		"\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
314 syn match   texMathDelim	contained		"\\lefteqn\>"
315 syn match   texMathDelimSet2	contained	"\\"		nextgroup=texMathDelimKey,texMathDelimBad
316 syn match   texMathDelimSet1	contained	"[<>()[\]|/.]\|\\[{}|]"
317 syn keyword texMathDelimKey	contained	backslash       lceil           lVert           rgroup          uparrow
318 syn keyword texMathDelimKey	contained	downarrow       lfloor          rangle          rmoustache      Uparrow
319 syn keyword texMathDelimKey	contained	Downarrow       lgroup          rbrace          rvert           updownarrow
320 syn keyword texMathDelimKey	contained	langle          lmoustache      rceil           rVert           Updownarrow
321 syn keyword texMathDelimKey	contained	lbrace          lvert           rfloor
322endif
323
324" Special TeX characters  ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
325syn match texSpecialChar	"\\[$&%#{}_]"
326if b:tex_stylish
327  syn match texSpecialChar	"\\[SP@][^a-zA-Z@]"me=e-1
328else
329  syn match texSpecialChar	"\\[SP@]\A"me=e-1
330endif
331syn match texSpecialChar	"\\\\"
332if !exists("tex_no_math")
333 syn match texOnlyMath		"[_^]"
334endif
335syn match texSpecialChar	"\^\^[0-9a-f]\{2}\|\^\^\S"
336
337" Comments: {{{1
338"    Normal TeX LaTeX     :   %....
339"    Documented TeX Format:  ^^A...	-and-	leading %s (only)
340syn cluster texCommentGroup	contains=texTodo,@Spell
341syn case ignore
342syn keyword texTodo		contained		combak	fixme	todo
343syn case match
344if b:extfname == "dtx"
345  syn match texComment		"\^\^A.*$"	contains=@texCommentGroup
346  syn match texComment		"^%\+"		contains=@texCommentGroup
347else
348  syn match texComment		"%.*$"		contains=@texCommentGroup
349endif
350
351" Separate lines used for verb` and verb# so that the end conditions {{{1
352" will appropriately terminate.  Ideally vim would let me save a
353" character from the start pattern and re-use it in the end-pattern.
354syn region texZone		start="\\begin{verbatim}"		end="\\end{verbatim}\|%stopzone\>"
355if version < 600
356 syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"
357 syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"
358else
359  if b:tex_stylish
360    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z@]\)"	end="\z1\|%stopzone\>"
361  else
362    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z]\)"	end="\z1\|%stopzone\>"
363  endif
364endif
365
366" Tex Reference Zones: {{{1
367syn region texZone		matchgroup=texStatement start="@samp{"			end="}\|%stopzone\>"	contains=@texRefGroup
368syn region texRefZone		matchgroup=texStatement start="\\nocite{"		end="}\|%stopzone\>"	contains=@texRefGroup
369syn region texRefZone		matchgroup=texStatement start="\\bibliography{"		end="}\|%stopzone\>"	contains=@texRefGroup
370syn region texRefZone		matchgroup=texStatement start="\\cite\([tp]\*\=\)\={"	end="}\|%stopzone\>"	contains=@texRefGroup
371syn region texRefZone		matchgroup=texStatement start="\\label{"		end="}\|%stopzone\>"	contains=@texRefGroup
372syn region texRefZone		matchgroup=texStatement start="\\\(page\|eq\)ref{"	end="}\|%stopzone\>"	contains=@texRefGroup
373syn region texRefZone		matchgroup=texStatement start="\\v\=ref{"		end="}\|%stopzone\>"	contains=@texRefGroup
374
375" Handle newcommand, newenvironment : {{{1
376syn match  texNewCmd				"\\newcommand\>"			nextgroup=texCmdName skipwhite skipnl
377syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
378syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]"		nextgroup=texCmdBody skipwhite skipnl
379syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]"	matchgroup=Delimiter end="}" contains=@texCmdGroup
380syn match  texNewEnv				"\\newenvironment\>"			nextgroup=texEnvName skipwhite skipnl
381syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvBgn skipwhite skipnl
382syn region texEnvBgn  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
383syn region texEnvEnd  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		skipwhite skipnl contains=@texEnvGroup
384
385" Definitions/Commands: {{{1
386syn match texDefCmd				"\\def\>"				nextgroup=texDefName skipwhite skipnl
387if b:tex_stylish
388  syn match texDefName contained		"\\[a-zA-Z@]\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
389  syn match texDefName contained		"\\[^a-zA-Z@]"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
390else
391  syn match texDefName contained		"\\\a\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
392  syn match texDefName contained		"\\\A"					nextgroup=texDefParms,texCmdBody skipwhite skipnl
393endif
394syn match texDefParms  contained		"#[^{]*"	contains=texDefParm	nextgroup=texCmdBody skipwhite skipnl
395syn match  texDefParm  contained		"#\d\+"
396
397" TeX Lengths: {{{1
398syn match  texLength		"\<\d\+\(\.\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
399
400" TeX String Delimiters: {{{1
401syn match texString		"\(``\|''\|,,\)"
402
403" LaTeX synchronization: {{{1
404syn sync maxlines=200
405syn sync minlines=50
406
407syn  sync match texSyncStop			groupthere NONE		"%stopzone\>"
408
409" Synchronization: {{{1
410" The $..$ and $$..$$ make for impossible sync patterns
411" (one can't tell if a "$$" starts or stops a math zone by itself)
412" The following grouptheres coupled with minlines above
413" help improve the odds of good syncing.
414if !exists("tex_no_math")
415 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{abstract}"
416 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{center}"
417 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{description}"
418 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{enumerate}"
419 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{itemize}"
420 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{table}"
421 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{tabular}"
422 syn sync match texSyncMathZoneA		groupthere NONE		"\\\(sub\)*section\>"
423endif
424
425" Highlighting: {{{1
426if did_tex_syntax_inits == 1
427 let did_tex_syntax_inits= 2
428  " TeX highlighting groups which should share similar highlighting
429  if !exists("g:tex_no_error")
430   if !exists("tex_no_math")
431    HiLink texBadMath		texError
432    HiLink texMathDelimBad	texError
433    HiLink texMathError		texError
434    if !b:tex_stylish
435      HiLink texOnlyMath	texError
436    endif
437   endif
438   HiLink texError		Error
439  endif
440
441  HiLink texDefCmd		texDef
442  HiLink texDefName		texDef
443  HiLink texDocType		texCmdName
444  HiLink texDocTypeArgs		texCmdArgs
445  HiLink texInputFileOpt	texCmdArgs
446  HiLink texInputCurlies	texDelimiter
447  HiLink texLigature		texSpecialChar
448  if !exists("tex_no_math")
449   HiLink texMathDelimSet1	texMathDelim
450   HiLink texMathDelimSet2	texMathDelim
451   HiLink texMathDelimKey	texMathDelim
452   HiLink texMathMatcher	texMath
453   HiLink texMathZoneW		texMath
454   HiLink texMathZoneX		texMath
455   HiLink texMathZoneY		texMath
456   HiLink texMathZoneZ		texMath
457  endif
458  HiLink texSectionMarker	texCmdName
459  HiLink texSectionName		texSection
460  HiLink texSpaceCode		texStatement
461  HiLink texTypeSize		texType
462  HiLink texTypeStyle		texType
463
464   " Basic TeX highlighting groups
465  HiLink texCmdArgs		Number
466  HiLink texCmdName		Statement
467  HiLink texComment		Comment
468  HiLink texDef			Statement
469  HiLink texDefParm		Special
470  HiLink texDelimiter		Delimiter
471  HiLink texInput		Special
472  HiLink texInputFile		Special
473  HiLink texLength		Number
474  HiLink texMath		Special
475  HiLink texMathDelim		Statement
476  HiLink texMathOper		Operator
477  HiLink texNewCmd		Statement
478  HiLink texNewEnv		Statement
479  HiLink texOption		Number
480  HiLink texRefZone		Special
481  HiLink texSection		PreCondit
482  HiLink texSpaceCodeChar	Special
483  HiLink texSpecialChar		SpecialChar
484  HiLink texStatement		Statement
485  HiLink texString		String
486  HiLink texTodo		Todo
487  HiLink texType		Type
488  HiLink texZone		PreCondit
489
490  delcommand HiLink
491endif
492
493" Current Syntax: {{{1
494unlet b:extfname
495let   b:current_syntax = "tex"
496" vim: ts=8 fdm=marker
497