blob: 2bc6045e9e431b49194f97b124aeeebd7553f1f3 [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 Moolenaarfd2ac762006-03-01 22:09:21 +00004" Last Change: Feb 28, 2006
5" Version: 32
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
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
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +0000258if g:tex_fold_enabled && has("folding")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000259 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
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000269else
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000270 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
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000280endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281
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")
Bram Moolenaar488c6512005-08-11 20:09:58 +0000291 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 " 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
Bram Moolenaarfd2ac762006-03-01 22:09:21 +0000375 if g:tex_fold_enabled
376 " allows syntax-folding of 2 or more contiguous comment lines
377 " single-line comments are not folded
378 syn match texComment "%.*$" contains=@texCommentGroup
379 syn region texComment start="^\zs\s*%.*\_s*%" skip="^\s*%" end='^\ze\s*[^%]' fold
380 else
381 syn match texComment "%.*$" contains=@texCommentGroup
382 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383endif
384
385" Separate lines used for verb` and verb# so that the end conditions {{{1
386" will appropriately terminate. Ideally vim would let me save a
387" character from the start pattern and re-use it in the end-pattern.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000388syn region texZone start="\\begin{verbatim}" end="\\end{verbatim}\|%stopzone\>" contains=@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389if version < 600
390 syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>"
391 syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>"
392else
393 if b:tex_stylish
394 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
395 else
396 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
397 endif
398endif
399
400" Tex Reference Zones: {{{1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000401syn region texZone matchgroup=texStatement start="@samp{" end="}\|%stopzone\>" contains=@texRefGroup
402syn region texRefZone matchgroup=texStatement start="\\nocite{" end="}\|%stopzone\>" contains=@texRefGroup
403syn region texRefZone matchgroup=texStatement start="\\bibliography{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000404syn region texRefZone matchgroup=texStatement start="\\label{" end="}\|%stopzone\>" contains=@texRefGroup
405syn region texRefZone matchgroup=texStatement start="\\\(page\|eq\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
406syn region texRefZone matchgroup=texStatement start="\\v\=ref{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000407syn match texRefZone '\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
408syn region texRefOption contained matchgroup=Delimiter start='\[' end=']' contains=@texRefGroup nextgroup=texRefOption,texCite
409syn region texCite contained matchgroup=Delimiter start='{' end='}' contains=@texRefGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410
411" Handle newcommand, newenvironment : {{{1
412syn match texNewCmd "\\newcommand\>" nextgroup=texCmdName skipwhite skipnl
413syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
414syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]" nextgroup=texCmdBody skipwhite skipnl
415syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]" matchgroup=Delimiter end="}" contains=@texCmdGroup
416syn match texNewEnv "\\newenvironment\>" nextgroup=texEnvName skipwhite skipnl
417syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvBgn skipwhite skipnl
418syn region texEnvBgn contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
419syn region texEnvEnd contained matchgroup=Delimiter start="{"rs=s+1 end="}" skipwhite skipnl contains=@texEnvGroup
420
421" Definitions/Commands: {{{1
422syn match texDefCmd "\\def\>" nextgroup=texDefName skipwhite skipnl
423if b:tex_stylish
424 syn match texDefName contained "\\[a-zA-Z@]\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
425 syn match texDefName contained "\\[^a-zA-Z@]" nextgroup=texDefParms,texCmdBody skipwhite skipnl
426else
427 syn match texDefName contained "\\\a\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
428 syn match texDefName contained "\\\A" nextgroup=texDefParms,texCmdBody skipwhite skipnl
429endif
430syn match texDefParms contained "#[^{]*" contains=texDefParm nextgroup=texCmdBody skipwhite skipnl
431syn match texDefParm contained "#\d\+"
432
433" TeX Lengths: {{{1
434syn match texLength "\<\d\+\(\.\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
435
436" TeX String Delimiters: {{{1
437syn match texString "\(``\|''\|,,\)"
438
439" LaTeX synchronization: {{{1
440syn sync maxlines=200
441syn sync minlines=50
442
443syn sync match texSyncStop groupthere NONE "%stopzone\>"
444
445" Synchronization: {{{1
446" The $..$ and $$..$$ make for impossible sync patterns
447" (one can't tell if a "$$" starts or stops a math zone by itself)
448" The following grouptheres coupled with minlines above
449" help improve the odds of good syncing.
450if !exists("tex_no_math")
451 syn sync match texSyncMathZoneA groupthere NONE "\\end{abstract}"
452 syn sync match texSyncMathZoneA groupthere NONE "\\end{center}"
453 syn sync match texSyncMathZoneA groupthere NONE "\\end{description}"
454 syn sync match texSyncMathZoneA groupthere NONE "\\end{enumerate}"
455 syn sync match texSyncMathZoneA groupthere NONE "\\end{itemize}"
456 syn sync match texSyncMathZoneA groupthere NONE "\\end{table}"
457 syn sync match texSyncMathZoneA groupthere NONE "\\end{tabular}"
458 syn sync match texSyncMathZoneA groupthere NONE "\\\(sub\)*section\>"
459endif
460
461" Highlighting: {{{1
462if did_tex_syntax_inits == 1
463 let did_tex_syntax_inits= 2
464 " TeX highlighting groups which should share similar highlighting
465 if !exists("g:tex_no_error")
466 if !exists("tex_no_math")
467 HiLink texBadMath texError
468 HiLink texMathDelimBad texError
469 HiLink texMathError texError
470 if !b:tex_stylish
471 HiLink texOnlyMath texError
472 endif
473 endif
474 HiLink texError Error
475 endif
476
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000477 HiLink texCite texRefZone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000478 HiLink texDefCmd texDef
479 HiLink texDefName texDef
480 HiLink texDocType texCmdName
481 HiLink texDocTypeArgs texCmdArgs
482 HiLink texInputFileOpt texCmdArgs
483 HiLink texInputCurlies texDelimiter
484 HiLink texLigature texSpecialChar
485 if !exists("tex_no_math")
486 HiLink texMathDelimSet1 texMathDelim
487 HiLink texMathDelimSet2 texMathDelim
488 HiLink texMathDelimKey texMathDelim
489 HiLink texMathMatcher texMath
490 HiLink texMathZoneW texMath
491 HiLink texMathZoneX texMath
492 HiLink texMathZoneY texMath
493 HiLink texMathZoneZ texMath
494 endif
495 HiLink texSectionMarker texCmdName
496 HiLink texSectionName texSection
497 HiLink texSpaceCode texStatement
498 HiLink texTypeSize texType
499 HiLink texTypeStyle texType
500
501 " Basic TeX highlighting groups
502 HiLink texCmdArgs Number
503 HiLink texCmdName Statement
504 HiLink texComment Comment
505 HiLink texDef Statement
506 HiLink texDefParm Special
507 HiLink texDelimiter Delimiter
508 HiLink texInput Special
509 HiLink texInputFile Special
510 HiLink texLength Number
511 HiLink texMath Special
512 HiLink texMathDelim Statement
513 HiLink texMathOper Operator
514 HiLink texNewCmd Statement
515 HiLink texNewEnv Statement
516 HiLink texOption Number
517 HiLink texRefZone Special
518 HiLink texSection PreCondit
519 HiLink texSpaceCodeChar Special
520 HiLink texSpecialChar SpecialChar
521 HiLink texStatement Statement
522 HiLink texString String
523 HiLink texTodo Todo
524 HiLink texType Type
525 HiLink texZone PreCondit
526
527 delcommand HiLink
528endif
529
530" Current Syntax: {{{1
531unlet b:extfname
532let b:current_syntax = "tex"
533" vim: ts=8 fdm=marker