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