blob: 6235df118c8849669998a0b1720c3daa480c0e10 [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 Moolenaar00a927d2010-05-14 23:24:24 +02004" Last Change: Apr 14, 2010
5" Version: 47
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"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020080 setl fdm=syntax
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +000081endif
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 Moolenaar5c736222010-01-06 20:54:52 +0100106syn cluster texStyleGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texStyleStatement,@Spell,texStyleMatcher
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000107syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108if !exists("tex_no_math")
109 syn cluster texMathZones contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
110 syn cluster texMatchGroup add=@texMathZones
111 syn cluster texMathDelimGroup contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2
112 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
113 syn cluster texMathZoneGroup contains=texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle
114 if !exists("g:tex_no_error")
115 syn cluster texMathMatchGroup add=texMathError
116 syn cluster texMathZoneGroup add=texMathError
117 endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000118 syn cluster texMathZoneGroup add=@NoSpell
119 " following used in the \part \chapter \section \subsection \subsubsection
120 " \paragraph \subparagraph \author \title highlighting
121 syn cluster texDocGroup contains=texPartZone,@texPartGroup
122 syn cluster texPartGroup contains=texChapterZone,texSectionZone,texParaZone
123 syn cluster texChapterGroup contains=texSectionZone,texParaZone
124 syn cluster texSectionGroup contains=texSubSectionZone,texParaZone
125 syn cluster texSubSectionGroup contains=texSubSubSectionZone,texParaZone
126 syn cluster texSubSubSectionGroup contains=texParaZone
127 syn cluster texParaGroup contains=texSubParaZone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128endif
129
130" Try to flag {} and () mismatches: {{{1
131if !exists("g:tex_no_error")
132 syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texMatchGroup,texError
133 syn region texMatcher matchgroup=Delimiter start="\[" end="]" contains=@texMatchGroup,texError
134else
135 syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texMatchGroup
136 syn region texMatcher matchgroup=Delimiter start="\[" end="]" contains=@texMatchGroup
137endif
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000138syn region texParen start="(" end=")" contains=@texMatchGroup,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139if !exists("g:tex_no_error")
140 syn match texError "[}\])]"
141endif
142if !exists("tex_no_math")
143 if !exists("g:tex_no_error")
144 syn match texMathError "}" contained
145 endif
146 syn region texMathMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\}" end="}" end="%stopzone\>" contained contains=@texMathMatchGroup
147endif
148
149" TeX/LaTeX keywords: {{{1
150" Instead of trying to be All Knowing, I just match \..alphameric..
151" Note that *.tex files may not have "@" in their \commands
152if exists("g:tex_tex") || b:tex_stylish
153 syn match texStatement "\\[a-zA-Z@]\+"
154else
155 syn match texStatement "\\\a\+"
156 if !exists("g:tex_no_error")
157 syn match texError "\\\a*@[a-zA-Z@]*"
158 endif
159endif
160
161" TeX/LaTeX delimiters: {{{1
162syn match texDelimiter "&"
163syn match texDelimiter "\\\\"
164
165" Tex/Latex Options: {{{1
166syn match texOption "[^\\]\zs#\d\+\|^#\d\+"
167
168" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
169if b:tex_stylish
170 syn match texAccent "\\[bcdvuH][^a-zA-Z@]"me=e-1
171 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
172else
173 syn match texAccent "\\[bcdvuH]\A"me=e-1
174 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
175endif
176syn match texAccent "\\[bcdvuH]$"
177syn match texAccent +\\[=^.\~"`']+
178syn match texAccent +\\['=t'.c^ud"vb~Hr]{\a}+
179syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
180
181" \begin{}/\end{} section markers: {{{1
182syn match texSectionMarker "\\begin\>\|\\end\>" nextgroup=texSectionName
Bram Moolenaar5c736222010-01-06 20:54:52 +0100183syn region texSectionName matchgroup=Delimiter start="{" end="}" contained nextgroup=texSectionModifier contains=texComment
184syn region texSectionModifier matchgroup=Delimiter start="\[" end="]" contained contains=texComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000185
186" \documentclass, \documentstyle, \usepackage: {{{1
187syn match texDocType "\\documentclass\>\|\\documentstyle\>\|\\usepackage\>" nextgroup=texSectionName,texDocTypeArgs
Bram Moolenaar5c736222010-01-06 20:54:52 +0100188syn region texDocTypeArgs matchgroup=Delimiter start="\[" end="]" contained nextgroup=texSectionName contains=texComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000189
Bram Moolenaara9a568c2006-03-14 23:04:27 +0000190" Preamble syntax-based folding support: {{{1
191if g:tex_fold_enabled && has("folding")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100192 syn region texPreamble transparent fold start='\zs\\documentclass\>' end='\ze\\begin{document}' contains=texStyle,@texMatchGroup
Bram Moolenaara9a568c2006-03-14 23:04:27 +0000193endif
194
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195" TeX input: {{{1
196syn match texInput "\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7 contains=texStatement
Bram Moolenaar5c736222010-01-06 20:54:52 +0100197syn match texInputFile "\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
Bram Moolenaar071d4272004-06-13 20:20:40 +0000198syn match texInputFile "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
199syn match texInputCurlies "[{}]" contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100200syn region texInputFileOpt matchgroup=Delimiter start="\[" end="\]" contained contains=texComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201
202" Type Styles (LaTeX 2.09): {{{1
203syn match texTypeStyle "\\rm\>"
204syn match texTypeStyle "\\em\>"
205syn match texTypeStyle "\\bf\>"
206syn match texTypeStyle "\\it\>"
207syn match texTypeStyle "\\sl\>"
208syn match texTypeStyle "\\sf\>"
209syn match texTypeStyle "\\sc\>"
210syn match texTypeStyle "\\tt\>"
211
212" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
213syn match texTypeStyle "\\textbf\>"
214syn match texTypeStyle "\\textit\>"
215syn match texTypeStyle "\\textmd\>"
216syn match texTypeStyle "\\textrm\>"
217syn match texTypeStyle "\\textsc\>"
218syn match texTypeStyle "\\textsf\>"
219syn match texTypeStyle "\\textsl\>"
220syn match texTypeStyle "\\texttt\>"
221syn match texTypeStyle "\\textup\>"
222syn match texTypeStyle "\\emph\>"
223
224syn match texTypeStyle "\\mathbb\>"
225syn match texTypeStyle "\\mathbf\>"
226syn match texTypeStyle "\\mathcal\>"
227syn match texTypeStyle "\\mathfrak\>"
228syn match texTypeStyle "\\mathit\>"
229syn match texTypeStyle "\\mathnormal\>"
230syn match texTypeStyle "\\mathrm\>"
231syn match texTypeStyle "\\mathsf\>"
232syn match texTypeStyle "\\mathtt\>"
233
234syn match texTypeStyle "\\rmfamily\>"
235syn match texTypeStyle "\\sffamily\>"
236syn match texTypeStyle "\\ttfamily\>"
237
238syn match texTypeStyle "\\itshape\>"
239syn match texTypeStyle "\\scshape\>"
240syn match texTypeStyle "\\slshape\>"
241syn match texTypeStyle "\\upshape\>"
242
243syn match texTypeStyle "\\bfseries\>"
244syn match texTypeStyle "\\mdseries\>"
245
246" Some type sizes: {{{1
247syn match texTypeSize "\\tiny\>"
248syn match texTypeSize "\\scriptsize\>"
249syn match texTypeSize "\\footnotesize\>"
250syn match texTypeSize "\\small\>"
251syn match texTypeSize "\\normalsize\>"
252syn match texTypeSize "\\large\>"
253syn match texTypeSize "\\Large\>"
254syn match texTypeSize "\\LARGE\>"
255syn match texTypeSize "\\huge\>"
256syn match texTypeSize "\\Huge\>"
257
258" Spacecodes (TeX'isms): {{{1
259" \mathcode`\^^@="2201 \delcode`\(="028300 \sfcode`\)=0 \uccode`X=`X \lccode`x=`x
260syn match texSpaceCode "\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
261syn match texSpaceCodeChar "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)" contained
262
263" Sections, subsections, etc: {{{1
Bram Moolenaarf1f8bc52005-03-07 23:20:08 +0000264if g:tex_fold_enabled && has("folding")
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000265 syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' fold contains=@texFoldGroup,@texDocGroup,@Spell
266 syn region texPartZone matchgroup=texSection start='\\part\>' end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)' fold contains=@texFoldGroup,@texPartGroup,@Spell
267 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)' fold contains=@texFoldGroup,@texChapterGroup,@Spell
268 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' fold contains=@texFoldGroup,@texSectionGroup,@Spell
269 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' fold contains=@texFoldGroup,@texSubSectionGroup,@Spell
270 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
271 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
272 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
273 syn region texTitle matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}' fold contains=@texFoldGroup,@Spell
274 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 +0000275else
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000276 syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' contains=@texFoldGroup,@texDocGroup,@Spell
277 syn region texPartZone matchgroup=texSection start='\\part\>' end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texPartGroup,@Spell
278 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texChapterGroup,@Spell
279 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSectionGroup,@Spell
280 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSectionGroup,@Spell
281 syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
282 syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texParaGroup,@Spell
283 syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@Spell
284 syn region texTitle matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}' contains=@texFoldGroup,@Spell
285 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 +0000286endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000287
288" Bad Math (mismatched): {{{1
289if !exists("tex_no_math")
290 syn match texBadMath "\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
291 syn match texBadMath "\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
292 syn match texBadMath "\\[\])]"
293endif
294
295" Math Zones: {{{1
296if !exists("tex_no_math")
Bram Moolenaar488c6512005-08-11 20:09:58 +0000297 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298 " Starred forms are created if starform is true. Starred
299 " forms have syntax group and synchronization groups with a
300 " "S" appended. Handles: cluster, syntax, sync, and HiLink.
301 fun! TexNewMathZone(sfx,mathzone,starform)
302 let grpname = "texMathZone".a:sfx
303 let syncname = "texSyncMathZone".a:sfx
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000304 if g:tex_fold_enabled
305 let foldcmd= " fold"
306 else
307 let foldcmd= ""
308 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309 exe "syn cluster texMathZones add=".grpname
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000310 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
312 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100313 exe 'hi def link '.grpname.' texMath'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000314 if a:starform
315 let grpname = "texMathZone".a:sfx.'S'
316 let syncname = "texSyncMathZone".a:sfx.'S'
317 exe "syn cluster texMathZones add=".grpname
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000318 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
320 exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
Bram Moolenaar5c736222010-01-06 20:54:52 +0100321 exe 'hi def link '.grpname.' texMath'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322 endif
323 endfun
324
325 " Standard Math Zones: {{{2
326 call TexNewMathZone("A","align",1)
327 call TexNewMathZone("B","alignat",1)
328 call TexNewMathZone("C","displaymath",1)
329 call TexNewMathZone("D","eqnarray",1)
330 call TexNewMathZone("E","equation",1)
331 call TexNewMathZone("F","flalign",1)
332 call TexNewMathZone("G","gather",1)
333 call TexNewMathZone("H","math",1)
334 call TexNewMathZone("I","multline",1)
335 call TexNewMathZone("J","subequations",0)
336 call TexNewMathZone("K","xalignat",1)
337 call TexNewMathZone("L","xxalignat",0)
338
339 " Inline Math Zones: {{{2
340 syn region texMathZoneV matchgroup=Delimiter start="\\(" matchgroup=Delimiter end="\\)\|%stopzone\>" keepend contains=@texMathZoneGroup
341 syn region texMathZoneW matchgroup=Delimiter start="\\\[" matchgroup=Delimiter end="\\]\|%stopzone\>" keepend contains=@texMathZoneGroup
342 syn region texMathZoneX matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>" contains=@texMathZoneGroup
343 syn region texMathZoneY matchgroup=Delimiter start="\$\$" matchgroup=Delimiter end="\$\$" end="%stopzone\>" keepend contains=@texMathZoneGroup
344 syn region texMathZoneZ matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>" contains=@texMathZoneGroup
345
346 syn match texMathOper "[_^=]" contained
347
348 " \left..something.. and \right..something.. support: {{{2
349 syn match texMathDelimBad contained "\S"
350 syn match texMathDelim contained "\\\(left\|right\|[bB]igg\=[lr]\)\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
351 syn match texMathDelim contained "\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
352 syn match texMathDelim contained "\\lefteqn\>"
353 syn match texMathDelimSet2 contained "\\" nextgroup=texMathDelimKey,texMathDelimBad
354 syn match texMathDelimSet1 contained "[<>()[\]|/.]\|\\[{}|]"
355 syn keyword texMathDelimKey contained backslash lceil lVert rgroup uparrow
356 syn keyword texMathDelimKey contained downarrow lfloor rangle rmoustache Uparrow
357 syn keyword texMathDelimKey contained Downarrow lgroup rbrace rvert updownarrow
358 syn keyword texMathDelimKey contained langle lmoustache rceil rVert Updownarrow
359 syn keyword texMathDelimKey contained lbrace lvert rfloor
360endif
361
362" Special TeX characters ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
363syn match texSpecialChar "\\[$&%#{}_]"
364if b:tex_stylish
365 syn match texSpecialChar "\\[SP@][^a-zA-Z@]"me=e-1
366else
367 syn match texSpecialChar "\\[SP@]\A"me=e-1
368endif
369syn match texSpecialChar "\\\\"
370if !exists("tex_no_math")
371 syn match texOnlyMath "[_^]"
372endif
373syn match texSpecialChar "\^\^[0-9a-f]\{2}\|\^\^\S"
374
375" Comments: {{{1
376" Normal TeX LaTeX : %....
377" Documented TeX Format: ^^A... -and- leading %s (only)
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000378if !exists("g:tex_comment_nospell") || !g:tex_comment_nospell
379 syn cluster texCommentGroup contains=texTodo,@Spell
380else
381 syn cluster texCommentGroup contains=texTodo,@NoSpell
382endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383syn case ignore
Bram Moolenaar18144c82006-04-12 21:52:12 +0000384syn keyword texTodo contained combak fixme todo xxx
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385syn case match
386if b:extfname == "dtx"
387 syn match texComment "\^\^A.*$" contains=@texCommentGroup
388 syn match texComment "^%\+" contains=@texCommentGroup
389else
Bram Moolenaarfd2ac762006-03-01 22:09:21 +0000390 if g:tex_fold_enabled
391 " allows syntax-folding of 2 or more contiguous comment lines
392 " single-line comments are not folded
393 syn match texComment "%.*$" contains=@texCommentGroup
394 syn region texComment start="^\zs\s*%.*\_s*%" skip="^\s*%" end='^\ze\s*[^%]' fold
395 else
396 syn match texComment "%.*$" contains=@texCommentGroup
397 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398endif
399
400" Separate lines used for verb` and verb# so that the end conditions {{{1
401" will appropriately terminate. Ideally vim would let me save a
402" character from the start pattern and re-use it in the end-pattern.
Bram Moolenaar5c736222010-01-06 20:54:52 +0100403syn region texZone start="\\begin{[vV]erbatim}" end="\\end{[vV]erbatim}\|%stopzone\>" contains=@Spell
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000404" listings package:
405syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>" contains=@Spell
406" moreverb package:
407syn region texZone start="\\begin{verbatimtab}" end="\\end{verbatimtab}\|%stopzone\>" contains=@Spell
408syn region texZone start="\\begin{verbatimwrite}" end="\\end{verbatimwrite}\|%stopzone\>" contains=@Spell
409syn region texZone start="\\begin{boxedverbatim}" end="\\end{boxedverbatim}\|%stopzone\>" contains=@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410if version < 600
411 syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>"
412 syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>"
413else
414 if b:tex_stylish
415 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
416 else
417 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
418 endif
419endif
420
421" Tex Reference Zones: {{{1
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000422syn region texZone matchgroup=texStatement start="@samp{" end="}\|%stopzone\>" contains=@texRefGroup
423syn region texRefZone matchgroup=texStatement start="\\nocite{" end="}\|%stopzone\>" contains=@texRefGroup
424syn region texRefZone matchgroup=texStatement start="\\bibliography{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcfbc5ee2004-07-02 15:38:35 +0000425syn region texRefZone matchgroup=texStatement start="\\label{" end="}\|%stopzone\>" contains=@texRefGroup
426syn region texRefZone matchgroup=texStatement start="\\\(page\|eq\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
427syn region texRefZone matchgroup=texStatement start="\\v\=ref{" end="}\|%stopzone\>" contains=@texRefGroup
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000428syn match texRefZone '\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
429syn region texRefOption contained matchgroup=Delimiter start='\[' end=']' contains=@texRefGroup nextgroup=texRefOption,texCite
430syn region texCite contained matchgroup=Delimiter start='{' end='}' contains=@texRefGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000431
432" Handle newcommand, newenvironment : {{{1
433syn match texNewCmd "\\newcommand\>" nextgroup=texCmdName skipwhite skipnl
434syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
435syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]" nextgroup=texCmdBody skipwhite skipnl
436syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]" matchgroup=Delimiter end="}" contains=@texCmdGroup
437syn match texNewEnv "\\newenvironment\>" nextgroup=texEnvName skipwhite skipnl
438syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvBgn skipwhite skipnl
439syn region texEnvBgn contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
440syn region texEnvEnd contained matchgroup=Delimiter start="{"rs=s+1 end="}" skipwhite skipnl contains=@texEnvGroup
441
442" Definitions/Commands: {{{1
443syn match texDefCmd "\\def\>" nextgroup=texDefName skipwhite skipnl
444if b:tex_stylish
445 syn match texDefName contained "\\[a-zA-Z@]\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
446 syn match texDefName contained "\\[^a-zA-Z@]" nextgroup=texDefParms,texCmdBody skipwhite skipnl
447else
448 syn match texDefName contained "\\\a\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
449 syn match texDefName contained "\\\A" nextgroup=texDefParms,texCmdBody skipwhite skipnl
450endif
451syn match texDefParms contained "#[^{]*" contains=texDefParm nextgroup=texCmdBody skipwhite skipnl
452syn match texDefParm contained "#\d\+"
453
454" TeX Lengths: {{{1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000455syn match texLength "\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000456
457" TeX String Delimiters: {{{1
458syn match texString "\(``\|''\|,,\)"
459
Bram Moolenaar5c736222010-01-06 20:54:52 +0100460" makeatletter -- makeatother sections
461if !exists("g:tex_no_error")
462 syn region texStyle matchgroup=texStatement start='\\makeatletter' end='\\makeatother' contains=@texStyleGroup contained
463 syn match texStyleStatement "\\[a-zA-Z@]\+" contained
464 syn region texStyleMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texStyleGroup,texError contained
465 syn region texStyleMatcher matchgroup=Delimiter start="\[" end="]" contains=@texStyleGroup,texError contained
466endif
467
Bram Moolenaar071d4272004-06-13 20:20:40 +0000468" LaTeX synchronization: {{{1
469syn sync maxlines=200
470syn sync minlines=50
471
472syn sync match texSyncStop groupthere NONE "%stopzone\>"
473
474" Synchronization: {{{1
475" The $..$ and $$..$$ make for impossible sync patterns
476" (one can't tell if a "$$" starts or stops a math zone by itself)
477" The following grouptheres coupled with minlines above
478" help improve the odds of good syncing.
479if !exists("tex_no_math")
480 syn sync match texSyncMathZoneA groupthere NONE "\\end{abstract}"
481 syn sync match texSyncMathZoneA groupthere NONE "\\end{center}"
482 syn sync match texSyncMathZoneA groupthere NONE "\\end{description}"
483 syn sync match texSyncMathZoneA groupthere NONE "\\end{enumerate}"
484 syn sync match texSyncMathZoneA groupthere NONE "\\end{itemize}"
485 syn sync match texSyncMathZoneA groupthere NONE "\\end{table}"
486 syn sync match texSyncMathZoneA groupthere NONE "\\end{tabular}"
487 syn sync match texSyncMathZoneA groupthere NONE "\\\(sub\)*section\>"
488endif
489
490" Highlighting: {{{1
491if did_tex_syntax_inits == 1
492 let did_tex_syntax_inits= 2
493 " TeX highlighting groups which should share similar highlighting
494 if !exists("g:tex_no_error")
495 if !exists("tex_no_math")
496 HiLink texBadMath texError
497 HiLink texMathDelimBad texError
498 HiLink texMathError texError
499 if !b:tex_stylish
500 HiLink texOnlyMath texError
501 endif
502 endif
503 HiLink texError Error
504 endif
505
Bram Moolenaarcc016f52005-12-10 20:23:46 +0000506 HiLink texCite texRefZone
Bram Moolenaar071d4272004-06-13 20:20:40 +0000507 HiLink texDefCmd texDef
508 HiLink texDefName texDef
509 HiLink texDocType texCmdName
510 HiLink texDocTypeArgs texCmdArgs
511 HiLink texInputFileOpt texCmdArgs
512 HiLink texInputCurlies texDelimiter
513 HiLink texLigature texSpecialChar
514 if !exists("tex_no_math")
515 HiLink texMathDelimSet1 texMathDelim
516 HiLink texMathDelimSet2 texMathDelim
517 HiLink texMathDelimKey texMathDelim
518 HiLink texMathMatcher texMath
Bram Moolenaar5c736222010-01-06 20:54:52 +0100519 HiLink texMathZoneV texMath
Bram Moolenaar071d4272004-06-13 20:20:40 +0000520 HiLink texMathZoneW texMath
521 HiLink texMathZoneX texMath
522 HiLink texMathZoneY texMath
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000523 HiLink texMathZoneV texMath
Bram Moolenaar071d4272004-06-13 20:20:40 +0000524 HiLink texMathZoneZ texMath
525 endif
526 HiLink texSectionMarker texCmdName
527 HiLink texSectionName texSection
528 HiLink texSpaceCode texStatement
Bram Moolenaar5c736222010-01-06 20:54:52 +0100529 HiLink texStyleStatement texStatement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000530 HiLink texTypeSize texType
531 HiLink texTypeStyle texType
532
533 " Basic TeX highlighting groups
534 HiLink texCmdArgs Number
535 HiLink texCmdName Statement
536 HiLink texComment Comment
537 HiLink texDef Statement
538 HiLink texDefParm Special
539 HiLink texDelimiter Delimiter
540 HiLink texInput Special
541 HiLink texInputFile Special
542 HiLink texLength Number
543 HiLink texMath Special
544 HiLink texMathDelim Statement
545 HiLink texMathOper Operator
546 HiLink texNewCmd Statement
547 HiLink texNewEnv Statement
548 HiLink texOption Number
549 HiLink texRefZone Special
550 HiLink texSection PreCondit
551 HiLink texSpaceCodeChar Special
552 HiLink texSpecialChar SpecialChar
553 HiLink texStatement Statement
554 HiLink texString String
555 HiLink texTodo Todo
556 HiLink texType Type
557 HiLink texZone PreCondit
558
559 delcommand HiLink
560endif
561
562" Current Syntax: {{{1
563unlet b:extfname
564let b:current_syntax = "tex"
565" vim: ts=8 fdm=marker