xref: /vim-8.2.3635/runtime/syntax/tex.vim (revision 3577c6fa)
1" Vim syntax file
2" Language:	TeX
3" Maintainer:	Dr. Charles E. Campbell, Jr. <[email protected]>
4" Last Change:	Jun 03, 2008
5" Version:	41
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:tex_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" Preamble syntax-based folding support: {{{1
190if g:tex_fold_enabled && has("folding")
191 syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=@texMatchGroup
192endif
193
194" TeX input: {{{1
195syn match texInput		"\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7				contains=texStatement
196syn match texInputFile		"\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}"	contains=texStatement,texInputCurlies
197syn match texInputFile		"\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"		contains=texStatement,texInputCurlies,texInputFileOpt
198syn match texInputCurlies	"[{}]"								contained
199syn region texInputFileOpt	matchgroup=Delimiter start="\[" end="\]"			contained
200
201" Type Styles (LaTeX 2.09): {{{1
202syn match texTypeStyle		"\\rm\>"
203syn match texTypeStyle		"\\em\>"
204syn match texTypeStyle		"\\bf\>"
205syn match texTypeStyle		"\\it\>"
206syn match texTypeStyle		"\\sl\>"
207syn match texTypeStyle		"\\sf\>"
208syn match texTypeStyle		"\\sc\>"
209syn match texTypeStyle		"\\tt\>"
210
211" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
212syn match texTypeStyle		"\\textbf\>"
213syn match texTypeStyle		"\\textit\>"
214syn match texTypeStyle		"\\textmd\>"
215syn match texTypeStyle		"\\textrm\>"
216syn match texTypeStyle		"\\textsc\>"
217syn match texTypeStyle		"\\textsf\>"
218syn match texTypeStyle		"\\textsl\>"
219syn match texTypeStyle		"\\texttt\>"
220syn match texTypeStyle		"\\textup\>"
221syn match texTypeStyle		"\\emph\>"
222
223syn match texTypeStyle		"\\mathbb\>"
224syn match texTypeStyle		"\\mathbf\>"
225syn match texTypeStyle		"\\mathcal\>"
226syn match texTypeStyle		"\\mathfrak\>"
227syn match texTypeStyle		"\\mathit\>"
228syn match texTypeStyle		"\\mathnormal\>"
229syn match texTypeStyle		"\\mathrm\>"
230syn match texTypeStyle		"\\mathsf\>"
231syn match texTypeStyle		"\\mathtt\>"
232
233syn match texTypeStyle		"\\rmfamily\>"
234syn match texTypeStyle		"\\sffamily\>"
235syn match texTypeStyle		"\\ttfamily\>"
236
237syn match texTypeStyle		"\\itshape\>"
238syn match texTypeStyle		"\\scshape\>"
239syn match texTypeStyle		"\\slshape\>"
240syn match texTypeStyle		"\\upshape\>"
241
242syn match texTypeStyle		"\\bfseries\>"
243syn match texTypeStyle		"\\mdseries\>"
244
245" Some type sizes: {{{1
246syn match texTypeSize		"\\tiny\>"
247syn match texTypeSize		"\\scriptsize\>"
248syn match texTypeSize		"\\footnotesize\>"
249syn match texTypeSize		"\\small\>"
250syn match texTypeSize		"\\normalsize\>"
251syn match texTypeSize		"\\large\>"
252syn match texTypeSize		"\\Large\>"
253syn match texTypeSize		"\\LARGE\>"
254syn match texTypeSize		"\\huge\>"
255syn match texTypeSize		"\\Huge\>"
256
257" Spacecodes (TeX'isms): {{{1
258" \mathcode`\^^@="2201  \delcode`\(="028300  \sfcode`\)=0 \uccode`X=`X  \lccode`x=`x
259syn match texSpaceCode		"\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
260syn match texSpaceCodeChar    "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)"	contained
261
262" Sections, subsections, etc: {{{1
263if g:tex_fold_enabled && has("folding")
264 syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											fold contains=@texFoldGroup,@texDocGroup,@Spell
265 syn region texPartZone			matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								fold contains=@texFoldGroup,@texPartGroup,@Spell
266 syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							fold contains=@texFoldGroup,@texChapterGroup,@Spell
267 syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					fold contains=@texFoldGroup,@texSectionGroup,@Spell
268 syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				fold contains=@texFoldGroup,@texSubSectionGroup,@Spell
269 syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				fold contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
270 syn region texParaZone			matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			fold contains=@texFoldGroup,@texParaGroup,@Spell
271 syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	fold contains=@texFoldGroup,@Spell
272 syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													fold contains=@texFoldGroup,@Spell
273 syn region texAbstract			matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											fold contains=@texFoldGroup,@Spell
274else
275 syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											contains=@texFoldGroup,@texDocGroup,@Spell
276 syn region texPartZone			matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								contains=@texFoldGroup,@texPartGroup,@Spell
277 syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							contains=@texFoldGroup,@texChapterGroup,@Spell
278 syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					contains=@texFoldGroup,@texSectionGroup,@Spell
279 syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSectionGroup,@Spell
280 syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
281 syn region texParaZone			matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			contains=@texFoldGroup,@texParaGroup,@Spell
282 syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	contains=@texFoldGroup,@Spell
283 syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													contains=@texFoldGroup,@Spell
284 syn region texAbstract			matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											contains=@texFoldGroup,@Spell
285endif
286
287" Bad Math (mismatched): {{{1
288if !exists("tex_no_math")
289 syn match texBadMath		"\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
290 syn match texBadMath		"\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
291 syn match texBadMath		"\\[\])]"
292endif
293
294" Math Zones: {{{1
295if !exists("tex_no_math")
296 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
297 "                 Starred forms are created if starform is true.  Starred
298 "                 forms have syntax group and synchronization groups with a
299 "                 "S" appended.  Handles: cluster, syntax, sync, and HiLink.
300 fun! TexNewMathZone(sfx,mathzone,starform)
301   let grpname  = "texMathZone".a:sfx
302   let syncname = "texSyncMathZone".a:sfx
303   if g:tex_fold_enabled
304    let foldcmd= " fold"
305   else
306    let foldcmd= ""
307   endif
308   exe "syn cluster texMathZones add=".grpname
309   exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
310   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
311   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
312   exe 'HiLink '.grpname.' texMath'
313   if a:starform
314    let grpname  = "texMathZone".a:sfx.'S'
315    let syncname = "texSyncMathZone".a:sfx.'S'
316    exe "syn cluster texMathZones add=".grpname
317    exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
318    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
319    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
320    exe 'HiLink '.grpname.' texMath'
321   endif
322 endfun
323
324 " Standard Math Zones: {{{2
325 call TexNewMathZone("A","align",1)
326 call TexNewMathZone("B","alignat",1)
327 call TexNewMathZone("C","displaymath",1)
328 call TexNewMathZone("D","eqnarray",1)
329 call TexNewMathZone("E","equation",1)
330 call TexNewMathZone("F","flalign",1)
331 call TexNewMathZone("G","gather",1)
332 call TexNewMathZone("H","math",1)
333 call TexNewMathZone("I","multline",1)
334 call TexNewMathZone("J","subequations",0)
335 call TexNewMathZone("K","xalignat",1)
336 call TexNewMathZone("L","xxalignat",0)
337
338 " Inline Math Zones: {{{2
339 syn region texMathZoneV	matchgroup=Delimiter start="\\("	matchgroup=Delimiter end="\\)\|%stopzone\>"	keepend contains=@texMathZoneGroup
340 syn region texMathZoneW	matchgroup=Delimiter start="\\\["	matchgroup=Delimiter end="\\]\|%stopzone\>"	keepend contains=@texMathZoneGroup
341 syn region texMathZoneX	matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>"	contains=@texMathZoneGroup
342 syn region texMathZoneY	matchgroup=Delimiter start="\$\$" matchgroup=Delimiter end="\$\$" end="%stopzone\>"	keepend		contains=@texMathZoneGroup
343 syn region texMathZoneZ	matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>"	contains=@texMathZoneGroup
344
345 syn match texMathOper		"[_^=]" contained
346
347 " \left..something.. and \right..something.. support: {{{2
348 syn match   texMathDelimBad	contained		"\S"
349 syn match   texMathDelim	contained		"\\\(left\|right\|[bB]igg\=[lr]\)\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
350 syn match   texMathDelim	contained		"\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
351 syn match   texMathDelim	contained		"\\lefteqn\>"
352 syn match   texMathDelimSet2	contained	"\\"		nextgroup=texMathDelimKey,texMathDelimBad
353 syn match   texMathDelimSet1	contained	"[<>()[\]|/.]\|\\[{}|]"
354 syn keyword texMathDelimKey	contained	backslash       lceil           lVert           rgroup          uparrow
355 syn keyword texMathDelimKey	contained	downarrow       lfloor          rangle          rmoustache      Uparrow
356 syn keyword texMathDelimKey	contained	Downarrow       lgroup          rbrace          rvert           updownarrow
357 syn keyword texMathDelimKey	contained	langle          lmoustache      rceil           rVert           Updownarrow
358 syn keyword texMathDelimKey	contained	lbrace          lvert           rfloor
359endif
360
361" Special TeX characters  ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
362syn match texSpecialChar	"\\[$&%#{}_]"
363if b:tex_stylish
364  syn match texSpecialChar	"\\[SP@][^a-zA-Z@]"me=e-1
365else
366  syn match texSpecialChar	"\\[SP@]\A"me=e-1
367endif
368syn match texSpecialChar	"\\\\"
369if !exists("tex_no_math")
370 syn match texOnlyMath		"[_^]"
371endif
372syn match texSpecialChar	"\^\^[0-9a-f]\{2}\|\^\^\S"
373
374" Comments: {{{1
375"    Normal TeX LaTeX     :   %....
376"    Documented TeX Format:  ^^A...	-and-	leading %s (only)
377if !exists("g:tex_comment_nospell") || !g:tex_comment_nospell
378 syn cluster texCommentGroup	contains=texTodo,@Spell
379else
380 syn cluster texCommentGroup	contains=texTodo,@NoSpell
381endif
382syn case ignore
383syn keyword texTodo		contained		combak	fixme	todo	xxx
384syn case match
385if b:extfname == "dtx"
386  syn match texComment		"\^\^A.*$"	contains=@texCommentGroup
387  syn match texComment		"^%\+"		contains=@texCommentGroup
388else
389  if g:tex_fold_enabled
390   " allows syntax-folding of 2 or more contiguous comment lines
391   " single-line comments are not folded
392   syn match  texComment	"%.*$"		contains=@texCommentGroup
393   syn region texComment	start="^\zs\s*%.*\_s*%"	skip="^\s*%"	end='^\ze\s*[^%]' fold
394  else
395   syn match texComment		"%.*$"		contains=@texCommentGroup
396  endif
397endif
398
399" Separate lines used for verb` and verb# so that the end conditions {{{1
400" will appropriately terminate.  Ideally vim would let me save a
401" character from the start pattern and re-use it in the end-pattern.
402syn region texZone		start="\\begin{verbatim}"		end="\\end{verbatim}\|%stopzone\>"	contains=@Spell
403" listings package:
404syn region texZone		start="\\begin{lstlisting}"		end="\\end{lstlisting}\|%stopzone\>"	contains=@Spell
405" moreverb package:
406syn region texZone		start="\\begin{verbatimtab}"		end="\\end{verbatimtab}\|%stopzone\>"	contains=@Spell
407syn region texZone		start="\\begin{verbatimwrite}"		end="\\end{verbatimwrite}\|%stopzone\>"	contains=@Spell
408syn region texZone		start="\\begin{boxedverbatim}"		end="\\end{boxedverbatim}\|%stopzone\>"	contains=@Spell
409if version < 600
410 syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"
411 syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"
412else
413  if b:tex_stylish
414    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z@]\)"	end="\z1\|%stopzone\>"
415  else
416    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z]\)"	end="\z1\|%stopzone\>"
417  endif
418endif
419
420" Tex Reference Zones: {{{1
421syn region texZone		matchgroup=texStatement start="@samp{"			end="}\|%stopzone\>"	contains=@texRefGroup
422syn region texRefZone		matchgroup=texStatement start="\\nocite{"		end="}\|%stopzone\>"	contains=@texRefGroup
423syn region texRefZone		matchgroup=texStatement start="\\bibliography{"		end="}\|%stopzone\>"	contains=@texRefGroup
424syn region texRefZone		matchgroup=texStatement start="\\label{"		end="}\|%stopzone\>"	contains=@texRefGroup
425syn region texRefZone		matchgroup=texStatement start="\\\(page\|eq\)ref{"	end="}\|%stopzone\>"	contains=@texRefGroup
426syn region texRefZone		matchgroup=texStatement start="\\v\=ref{"		end="}\|%stopzone\>"	contains=@texRefGroup
427syn match  texRefZone		'\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
428syn region texRefOption	contained	matchgroup=Delimiter start='\[' end=']'		contains=@texRefGroup	nextgroup=texRefOption,texCite
429syn region texCite	contained	matchgroup=Delimiter start='{' end='}'		contains=@texRefGroup
430
431" Handle newcommand, newenvironment : {{{1
432syn match  texNewCmd				"\\newcommand\>"			nextgroup=texCmdName skipwhite skipnl
433syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
434syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]"		nextgroup=texCmdBody skipwhite skipnl
435syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]"	matchgroup=Delimiter end="}" contains=@texCmdGroup
436syn match  texNewEnv				"\\newenvironment\>"			nextgroup=texEnvName skipwhite skipnl
437syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvBgn skipwhite skipnl
438syn region texEnvBgn  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
439syn region texEnvEnd  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		skipwhite skipnl contains=@texEnvGroup
440
441" Definitions/Commands: {{{1
442syn match texDefCmd				"\\def\>"				nextgroup=texDefName skipwhite skipnl
443if b:tex_stylish
444  syn match texDefName contained		"\\[a-zA-Z@]\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
445  syn match texDefName contained		"\\[^a-zA-Z@]"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
446else
447  syn match texDefName contained		"\\\a\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
448  syn match texDefName contained		"\\\A"					nextgroup=texDefParms,texCmdBody skipwhite skipnl
449endif
450syn match texDefParms  contained		"#[^{]*"	contains=texDefParm	nextgroup=texCmdBody skipwhite skipnl
451syn match  texDefParm  contained		"#\d\+"
452
453" TeX Lengths: {{{1
454syn match  texLength		"\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
455
456" TeX String Delimiters: {{{1
457syn match texString		"\(``\|''\|,,\)"
458
459" LaTeX synchronization: {{{1
460syn sync maxlines=200
461syn sync minlines=50
462
463syn  sync match texSyncStop			groupthere NONE		"%stopzone\>"
464
465" Synchronization: {{{1
466" The $..$ and $$..$$ make for impossible sync patterns
467" (one can't tell if a "$$" starts or stops a math zone by itself)
468" The following grouptheres coupled with minlines above
469" help improve the odds of good syncing.
470if !exists("tex_no_math")
471 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{abstract}"
472 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{center}"
473 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{description}"
474 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{enumerate}"
475 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{itemize}"
476 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{table}"
477 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{tabular}"
478 syn sync match texSyncMathZoneA		groupthere NONE		"\\\(sub\)*section\>"
479endif
480
481" Highlighting: {{{1
482if did_tex_syntax_inits == 1
483 let did_tex_syntax_inits= 2
484  " TeX highlighting groups which should share similar highlighting
485  if !exists("g:tex_no_error")
486   if !exists("tex_no_math")
487    HiLink texBadMath		texError
488    HiLink texMathDelimBad	texError
489    HiLink texMathError		texError
490    if !b:tex_stylish
491      HiLink texOnlyMath	texError
492    endif
493   endif
494   HiLink texError		Error
495  endif
496
497  HiLink texCite		texRefZone
498  HiLink texDefCmd		texDef
499  HiLink texDefName		texDef
500  HiLink texDocType		texCmdName
501  HiLink texDocTypeArgs		texCmdArgs
502  HiLink texInputFileOpt	texCmdArgs
503  HiLink texInputCurlies	texDelimiter
504  HiLink texLigature		texSpecialChar
505  if !exists("tex_no_math")
506   HiLink texMathDelimSet1	texMathDelim
507   HiLink texMathDelimSet2	texMathDelim
508   HiLink texMathDelimKey	texMathDelim
509   HiLink texMathMatcher	texMath
510   HiLink texMathZoneW		texMath
511   HiLink texMathZoneX		texMath
512   HiLink texMathZoneY		texMath
513   HiLink texMathZoneV		texMath
514   HiLink texMathZoneZ		texMath
515  endif
516  HiLink texSectionMarker	texCmdName
517  HiLink texSectionName		texSection
518  HiLink texSpaceCode		texStatement
519  HiLink texTypeSize		texType
520  HiLink texTypeStyle		texType
521
522   " Basic TeX highlighting groups
523  HiLink texCmdArgs		Number
524  HiLink texCmdName		Statement
525  HiLink texComment		Comment
526  HiLink texDef			Statement
527  HiLink texDefParm		Special
528  HiLink texDelimiter		Delimiter
529  HiLink texInput		Special
530  HiLink texInputFile		Special
531  HiLink texLength		Number
532  HiLink texMath		Special
533  HiLink texMathDelim		Statement
534  HiLink texMathOper		Operator
535  HiLink texNewCmd		Statement
536  HiLink texNewEnv		Statement
537  HiLink texOption		Number
538  HiLink texRefZone		Special
539  HiLink texSection		PreCondit
540  HiLink texSpaceCodeChar	Special
541  HiLink texSpecialChar		SpecialChar
542  HiLink texStatement		Statement
543  HiLink texString		String
544  HiLink texTodo		Todo
545  HiLink texType		Type
546  HiLink texZone		PreCondit
547
548  delcommand HiLink
549endif
550
551" Current Syntax: {{{1
552unlet b:extfname
553let   b:current_syntax = "tex"
554" vim: ts=8 fdm=marker
555