blob: 092faa92d6bcc8db78714d447cae6ad3e2ac8860 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: TeX
Bram Moolenaar488c6512005-08-11 20:09:58 +00003" Maintainer: Dr. Charles E. Campbell, Jr. <NdrchipO@ScampbellPfamily.AbizM>
Bram Moolenaara9a568c2006-03-14 23:04:27 +00004" Last Change: Mar 06, 2006
5" Version: 33
Bram Moolenaar488c6512005-08-11 20:09:58 +00006" URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +00007"
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
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +000056" Determine whether or not to use "*.sty" mode {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000057" 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
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +000072" handle folding {{{1
73if !exists("g:tex_fold_enabled")
74 let g:tex_fold_enabled= 0
75elseif g:tex_fold_enabled && !has("folding")
Bram Moolenaarab194812005-09-14 21:40:12 +000076 let g:tex_fold_enabled= 0
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +000077 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000083" (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
Bram Moolenaar488c6512005-08-11 20:09:58 +0000104syn 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
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000105syn 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
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000106syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000107if !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
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000117 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127endif
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
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000137syn region texParen start="(" end=")" contains=@texMatchGroup,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138if !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
Bram Moolenaara9a568c2006-03-14 23:04:27 +0000189" 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194" 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
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +0000263if g:tex_fold_enabled && has("folding")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000264 syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' fold keepend contains=@texFoldGroup,@texDocGroup,@Spell
265 syn region texPartZone matchgroup=texSection start='\\part\>' end='\n\ze\s*\\part\>' fold keepend contains=@texFoldGroup,@texPartGroup,@Spell
266 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\n\ze\s*\\chapter\>' fold keepend contains=@texFoldGroup,@texChapterGroup,@Spell
267 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\n\ze\s*\\section\>' fold keepend contains=@texFoldGroup,@texSectionGroup,@Spell
268 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\n\ze\s*\\subsection\>' fold keepend contains=@texFoldGroup,@texSubSectionGroup,@Spell
269 syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\n\ze\s*\\subsubsection\>' fold keepend contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
270 syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\n\ze\s*\\paragraph\>' fold keepend contains=@texFoldGroup,@texParaGroup,@Spell
271 syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\n\ze\s*\\subparagraph\>' fold keepend 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
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000274else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000275 syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' keepend contains=@texFoldGroup,@texDocGroup,@Spell
276 syn region texPartZone matchgroup=texSection start='\\part\>' end='\n\ze\s*\\part\>' keepend contains=@texFoldGroup,@texPartGroup,@Spell
277 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\n\ze\s*\\chapter\>' keepend contains=@texFoldGroup,@texChapterGroup,@Spell
278 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\n\ze\s*\\section\>' keepend contains=@texFoldGroup,@texSectionGroup,@Spell
279 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\n\ze\s*\\subsection\>' keepend contains=@texFoldGroup,@texSubSectionGroup,@Spell
280 syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\n\ze\s*\\subsubsection\>' keepend contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
281 syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\n\ze\s*\\paragraph\>' keepend contains=@texFoldGroup,@texParaGroup,@Spell
282 syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\n\ze\s*\\subparagraph\>' keepend 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
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000285endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286
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")
Bram Moolenaar488c6512005-08-11 20:09:58 +0000296 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297 " 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 exe "syn cluster texMathZones add=".grpname
304 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'
305 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
306 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
307 exe 'HiLink '.grpname.' texMath'
308 if a:starform
309 let grpname = "texMathZone".a:sfx.'S'
310 let syncname = "texSyncMathZone".a:sfx.'S'
311 exe "syn cluster texMathZones add=".grpname
312 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'
313 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
314 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
315 exe 'HiLink '.grpname.' texMath'
316 endif
317 endfun
318
319 " Standard Math Zones: {{{2
320 call TexNewMathZone("A","align",1)
321 call TexNewMathZone("B","alignat",1)
322 call TexNewMathZone("C","displaymath",1)
323 call TexNewMathZone("D","eqnarray",1)
324 call TexNewMathZone("E","equation",1)
325 call TexNewMathZone("F","flalign",1)
326 call TexNewMathZone("G","gather",1)
327 call TexNewMathZone("H","math",1)
328 call TexNewMathZone("I","multline",1)
329 call TexNewMathZone("J","subequations",0)
330 call TexNewMathZone("K","xalignat",1)
331 call TexNewMathZone("L","xxalignat",0)
332
333 " Inline Math Zones: {{{2
334 syn region texMathZoneV matchgroup=Delimiter start="\\(" matchgroup=Delimiter end="\\)\|%stopzone\>" keepend contains=@texMathZoneGroup
335 syn region texMathZoneW matchgroup=Delimiter start="\\\[" matchgroup=Delimiter end="\\]\|%stopzone\>" keepend contains=@texMathZoneGroup
336 syn region texMathZoneX matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>" contains=@texMathZoneGroup
337 syn region texMathZoneY matchgroup=Delimiter start="\$\$" matchgroup=Delimiter end="\$\$" end="%stopzone\>" keepend contains=@texMathZoneGroup
338 syn region texMathZoneZ matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>" contains=@texMathZoneGroup
339
340 syn match texMathOper "[_^=]" contained
341
342 " \left..something.. and \right..something.. support: {{{2
343 syn match texMathDelimBad contained "\S"
344 syn match texMathDelim contained "\\\(left\|right\|[bB]igg\=[lr]\)\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
345 syn match texMathDelim contained "\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
346 syn match texMathDelim contained "\\lefteqn\>"
347 syn match texMathDelimSet2 contained "\\" nextgroup=texMathDelimKey,texMathDelimBad
348 syn match texMathDelimSet1 contained "[<>()[\]|/.]\|\\[{}|]"
349 syn keyword texMathDelimKey contained backslash lceil lVert rgroup uparrow
350 syn keyword texMathDelimKey contained downarrow lfloor rangle rmoustache Uparrow
351 syn keyword texMathDelimKey contained Downarrow lgroup rbrace rvert updownarrow
352 syn keyword texMathDelimKey contained langle lmoustache rceil rVert Updownarrow
353 syn keyword texMathDelimKey contained lbrace lvert rfloor
354endif
355
356" Special TeX characters ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
357syn match texSpecialChar "\\[$&%#{}_]"
358if b:tex_stylish
359 syn match texSpecialChar "\\[SP@][^a-zA-Z@]"me=e-1
360else
361 syn match texSpecialChar "\\[SP@]\A"me=e-1
362endif
363syn match texSpecialChar "\\\\"
364if !exists("tex_no_math")
365 syn match texOnlyMath "[_^]"
366endif
367syn match texSpecialChar "\^\^[0-9a-f]\{2}\|\^\^\S"
368
369" Comments: {{{1
370" Normal TeX LaTeX : %....
371" Documented TeX Format: ^^A... -and- leading %s (only)
372syn cluster texCommentGroup contains=texTodo,@Spell
373syn case ignore
374syn keyword texTodo contained combak fixme todo
375syn case match
376if b:extfname == "dtx"
377 syn match texComment "\^\^A.*$" contains=@texCommentGroup
378 syn match texComment "^%\+" contains=@texCommentGroup
379else
Bram Moolenaarfd2ac762006-03-01 22:09:21 +0000380 if g:tex_fold_enabled
381 " allows syntax-folding of 2 or more contiguous comment lines
382 " single-line comments are not folded
383 syn match texComment "%.*$" contains=@texCommentGroup
384 syn region texComment start="^\zs\s*%.*\_s*%" skip="^\s*%" end='^\ze\s*[^%]' fold
385 else
386 syn match texComment "%.*$" contains=@texCommentGroup
387 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388endif
389
390" Separate lines used for verb` and verb# so that the end conditions {{{1
391" will appropriately terminate. Ideally vim would let me save a
392" character from the start pattern and re-use it in the end-pattern.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000393syn region texZone start="\\begin{verbatim}" end="\\end{verbatim}\|%stopzone\>" contains=@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394if version < 600
395 syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>"
396 syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>"
397else
398 if b:tex_stylish
399 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
400 else
401 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
402 endif
403endif
404
405" Tex Reference Zones: {{{1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000406syn region texZone matchgroup=texStatement start="@samp{" end="}\|%stopzone\>" contains=@texRefGroup
407syn region texRefZone matchgroup=texStatement start="\\nocite{" end="}\|%stopzone\>" contains=@texRefGroup
408syn region texRefZone matchgroup=texStatement start="\\bibliography{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000409syn region texRefZone matchgroup=texStatement start="\\label{" end="}\|%stopzone\>" contains=@texRefGroup
410syn region texRefZone matchgroup=texStatement start="\\\(page\|eq\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
411syn region texRefZone matchgroup=texStatement start="\\v\=ref{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000412syn match texRefZone '\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
413syn region texRefOption contained matchgroup=Delimiter start='\[' end=']' contains=@texRefGroup nextgroup=texRefOption,texCite
414syn region texCite contained matchgroup=Delimiter start='{' end='}' contains=@texRefGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000415
416" Handle newcommand, newenvironment : {{{1
417syn match texNewCmd "\\newcommand\>" nextgroup=texCmdName skipwhite skipnl
418syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
419syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]" nextgroup=texCmdBody skipwhite skipnl
420syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]" matchgroup=Delimiter end="}" contains=@texCmdGroup
421syn match texNewEnv "\\newenvironment\>" nextgroup=texEnvName skipwhite skipnl
422syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvBgn skipwhite skipnl
423syn region texEnvBgn contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
424syn region texEnvEnd contained matchgroup=Delimiter start="{"rs=s+1 end="}" skipwhite skipnl contains=@texEnvGroup
425
426" Definitions/Commands: {{{1
427syn match texDefCmd "\\def\>" nextgroup=texDefName skipwhite skipnl
428if b:tex_stylish
429 syn match texDefName contained "\\[a-zA-Z@]\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
430 syn match texDefName contained "\\[^a-zA-Z@]" nextgroup=texDefParms,texCmdBody skipwhite skipnl
431else
432 syn match texDefName contained "\\\a\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
433 syn match texDefName contained "\\\A" nextgroup=texDefParms,texCmdBody skipwhite skipnl
434endif
435syn match texDefParms contained "#[^{]*" contains=texDefParm nextgroup=texCmdBody skipwhite skipnl
436syn match texDefParm contained "#\d\+"
437
438" TeX Lengths: {{{1
439syn match texLength "\<\d\+\(\.\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
440
441" TeX String Delimiters: {{{1
442syn match texString "\(``\|''\|,,\)"
443
444" LaTeX synchronization: {{{1
445syn sync maxlines=200
446syn sync minlines=50
447
448syn sync match texSyncStop groupthere NONE "%stopzone\>"
449
450" Synchronization: {{{1
451" The $..$ and $$..$$ make for impossible sync patterns
452" (one can't tell if a "$$" starts or stops a math zone by itself)
453" The following grouptheres coupled with minlines above
454" help improve the odds of good syncing.
455if !exists("tex_no_math")
456 syn sync match texSyncMathZoneA groupthere NONE "\\end{abstract}"
457 syn sync match texSyncMathZoneA groupthere NONE "\\end{center}"
458 syn sync match texSyncMathZoneA groupthere NONE "\\end{description}"
459 syn sync match texSyncMathZoneA groupthere NONE "\\end{enumerate}"
460 syn sync match texSyncMathZoneA groupthere NONE "\\end{itemize}"
461 syn sync match texSyncMathZoneA groupthere NONE "\\end{table}"
462 syn sync match texSyncMathZoneA groupthere NONE "\\end{tabular}"
463 syn sync match texSyncMathZoneA groupthere NONE "\\\(sub\)*section\>"
464endif
465
466" Highlighting: {{{1
467if did_tex_syntax_inits == 1
468 let did_tex_syntax_inits= 2
469 " TeX highlighting groups which should share similar highlighting
470 if !exists("g:tex_no_error")
471 if !exists("tex_no_math")
472 HiLink texBadMath texError
473 HiLink texMathDelimBad texError
474 HiLink texMathError texError
475 if !b:tex_stylish
476 HiLink texOnlyMath texError
477 endif
478 endif
479 HiLink texError Error
480 endif
481
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000482 HiLink texCite texRefZone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483 HiLink texDefCmd texDef
484 HiLink texDefName texDef
485 HiLink texDocType texCmdName
486 HiLink texDocTypeArgs texCmdArgs
487 HiLink texInputFileOpt texCmdArgs
488 HiLink texInputCurlies texDelimiter
489 HiLink texLigature texSpecialChar
490 if !exists("tex_no_math")
491 HiLink texMathDelimSet1 texMathDelim
492 HiLink texMathDelimSet2 texMathDelim
493 HiLink texMathDelimKey texMathDelim
494 HiLink texMathMatcher texMath
495 HiLink texMathZoneW texMath
496 HiLink texMathZoneX texMath
497 HiLink texMathZoneY texMath
498 HiLink texMathZoneZ texMath
499 endif
500 HiLink texSectionMarker texCmdName
501 HiLink texSectionName texSection
502 HiLink texSpaceCode texStatement
503 HiLink texTypeSize texType
504 HiLink texTypeStyle texType
505
506 " Basic TeX highlighting groups
507 HiLink texCmdArgs Number
508 HiLink texCmdName Statement
509 HiLink texComment Comment
510 HiLink texDef Statement
511 HiLink texDefParm Special
512 HiLink texDelimiter Delimiter
513 HiLink texInput Special
514 HiLink texInputFile Special
515 HiLink texLength Number
516 HiLink texMath Special
517 HiLink texMathDelim Statement
518 HiLink texMathOper Operator
519 HiLink texNewCmd Statement
520 HiLink texNewEnv Statement
521 HiLink texOption Number
522 HiLink texRefZone Special
523 HiLink texSection PreCondit
524 HiLink texSpaceCodeChar Special
525 HiLink texSpecialChar SpecialChar
526 HiLink texStatement Statement
527 HiLink texString String
528 HiLink texTodo Todo
529 HiLink texType Type
530 HiLink texZone PreCondit
531
532 delcommand HiLink
533endif
534
535" Current Syntax: {{{1
536unlet b:extfname
537let b:current_syntax = "tex"
538" vim: ts=8 fdm=marker