3 " Maintainer: Dr. Charles E. Campbell, Jr. <NdrchipO@ScampbellPfamily.AbizM>
4 " Last Change: Oct 10, 2007
6 " URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
10 " 1. If you have a \begin{verbatim} that appears to overrun its boundaries,
13 " 2. Run-on equations ($..$ and $$..$$, particularly) can also be stopped
14 " by suitable use of %stopzone.
16 " 3. If you have a slow computer, you may wish to modify
18 " syn sync maxlines=200
19 " syn sync minlines=50
21 " to values that are more to your liking.
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)
27 " 5. If you have the variable "g:tex_no_error" defined then none of the
28 " lexical error-checking will be done.
30 " ie. let g:tex_no_error=1
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
37 elseif exists("b:current_syntax")
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
44 if version >= 508 || !exists("did_tex_syntax_inits")
45 let did_tex_syntax_inits = 1
47 command -nargs=+ HiLink hi link <args>
49 command -nargs=+ HiLink hi def link <args>
52 if exists("g:tex_tex") && !exists("g:tex_no_error")
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
61 let b:extfname=expand("%:e")
62 if exists("g:tex_stylish")
63 let b:tex_stylish= g:tex_stylish
64 elseif !exists("b:tex_stylish")
65 if b:extfname == "sty" || b:extfname == "cls" || b:extfname == "clo" || b:extfname == "dtx" || b:extfname == "ltx"
73 if !exists("g:tex_fold_enabled")
74 let g:tex_fold_enabled= 0
75 elseif 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"
79 if g:tex_fold_enabled && &fdm == "manual"
83 " (La)TeX keywords: only use the letters a-zA-Z {{{1
84 " but _ is the only one that causes problems.
99 syn cluster texCmdGroup contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSectionMarker,texSectionName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle
100 if !exists("g:tex_no_error")
101 syn cluster texCmdGroup add=texMathError
103 syn cluster texEnvGroup contains=texMatcher,texMathDelim,texSpecialChar,texStatement
104 syn 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
105 syn 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
106 syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter
107 if !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
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
129 " Try to flag {} and () mismatches: {{{1
130 if !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
134 syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texMatchGroup
135 syn region texMatcher matchgroup=Delimiter start="\[" end="]" contains=@texMatchGroup
137 syn region texParen start="(" end=")" contains=@texMatchGroup,@Spell
138 if !exists("g:tex_no_error")
139 syn match texError "[}\])]"
141 if !exists("tex_no_math")
142 if !exists("g:tex_no_error")
143 syn match texMathError "}" contained
145 syn region texMathMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\}" end="}" end="%stopzone\>" contained contains=@texMathMatchGroup
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
151 if exists("g:tex_tex") || b:tex_stylish
152 syn match texStatement "\\[a-zA-Z@]\+"
154 syn match texStatement "\\\a\+"
155 if !exists("g:tex_no_error")
156 syn match texError "\\\a*@[a-zA-Z@]*"
160 " TeX/LaTeX delimiters: {{{1
161 syn match texDelimiter "&"
162 syn match texDelimiter "\\\\"
164 " Tex/Latex Options: {{{1
165 syn match texOption "[^\\]\zs#\d\+\|^#\d\+"
167 " texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
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
172 syn match texAccent "\\[bcdvuH]\A"me=e-1
173 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
175 syn match texAccent "\\[bcdvuH]$"
176 syn match texAccent +\\[=^.\~"`']+
177 syn match texAccent +\\['=t'.c^ud"vb~Hr]{\a}+
178 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
180 " \begin{}/\end{} section markers: {{{1
181 syn match texSectionMarker "\\begin\>\|\\end\>" nextgroup=texSectionName
182 syn region texSectionName matchgroup=Delimiter start="{" end="}" contained nextgroup=texSectionModifier
183 syn region texSectionModifier matchgroup=Delimiter start="\[" end="]" contained
185 " \documentclass, \documentstyle, \usepackage: {{{1
186 syn match texDocType "\\documentclass\>\|\\documentstyle\>\|\\usepackage\>" nextgroup=texSectionName,texDocTypeArgs
187 syn region texDocTypeArgs matchgroup=Delimiter start="\[" end="]" contained nextgroup=texSectionName
189 " Preamble syntax-based folding support: {{{1
190 if g:tex_fold_enabled && has("folding")
191 syn region texPreamble transparent fold start='\zs\\documentclass\>' end='\ze\\begin{document}' contains=@texMatchGroup
195 syn match texInput "\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7 contains=texStatement
196 syn match texInputFile "\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}" contains=texStatement,texInputCurlies
197 syn match texInputFile "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
198 syn match texInputCurlies "[{}]" contained
199 syn region texInputFileOpt matchgroup=Delimiter start="\[" end="\]" contained
201 " Type Styles (LaTeX 2.09): {{{1
202 syn match texTypeStyle "\\rm\>"
203 syn match texTypeStyle "\\em\>"
204 syn match texTypeStyle "\\bf\>"
205 syn match texTypeStyle "\\it\>"
206 syn match texTypeStyle "\\sl\>"
207 syn match texTypeStyle "\\sf\>"
208 syn match texTypeStyle "\\sc\>"
209 syn match texTypeStyle "\\tt\>"
211 " Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
212 syn match texTypeStyle "\\textbf\>"
213 syn match texTypeStyle "\\textit\>"
214 syn match texTypeStyle "\\textmd\>"
215 syn match texTypeStyle "\\textrm\>"
216 syn match texTypeStyle "\\textsc\>"
217 syn match texTypeStyle "\\textsf\>"
218 syn match texTypeStyle "\\textsl\>"
219 syn match texTypeStyle "\\texttt\>"
220 syn match texTypeStyle "\\textup\>"
221 syn match texTypeStyle "\\emph\>"
223 syn match texTypeStyle "\\mathbb\>"
224 syn match texTypeStyle "\\mathbf\>"
225 syn match texTypeStyle "\\mathcal\>"
226 syn match texTypeStyle "\\mathfrak\>"
227 syn match texTypeStyle "\\mathit\>"
228 syn match texTypeStyle "\\mathnormal\>"
229 syn match texTypeStyle "\\mathrm\>"
230 syn match texTypeStyle "\\mathsf\>"
231 syn match texTypeStyle "\\mathtt\>"
233 syn match texTypeStyle "\\rmfamily\>"
234 syn match texTypeStyle "\\sffamily\>"
235 syn match texTypeStyle "\\ttfamily\>"
237 syn match texTypeStyle "\\itshape\>"
238 syn match texTypeStyle "\\scshape\>"
239 syn match texTypeStyle "\\slshape\>"
240 syn match texTypeStyle "\\upshape\>"
242 syn match texTypeStyle "\\bfseries\>"
243 syn match texTypeStyle "\\mdseries\>"
245 " Some type sizes: {{{1
246 syn match texTypeSize "\\tiny\>"
247 syn match texTypeSize "\\scriptsize\>"
248 syn match texTypeSize "\\footnotesize\>"
249 syn match texTypeSize "\\small\>"
250 syn match texTypeSize "\\normalsize\>"
251 syn match texTypeSize "\\large\>"
252 syn match texTypeSize "\\Large\>"
253 syn match texTypeSize "\\LARGE\>"
254 syn match texTypeSize "\\huge\>"
255 syn match texTypeSize "\\Huge\>"
257 " Spacecodes (TeX'isms): {{{1
258 " \mathcode`\^^@="2201 \delcode`\(="028300 \sfcode`\)=0 \uccode`X=`X \lccode`x=`x
259 syn match texSpaceCode "\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
260 syn match texSpaceCodeChar "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)" contained
262 " Sections, subsections, etc: {{{1
263 if 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\n\s*\\part\>' fold contains=@texFoldGroup,@texPartGroup,@Spell
266 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\n\s*\\\%(chapter\|part\)\>' fold contains=@texFoldGroup,@texChapterGroup,@Spell
267 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\n\s*\\\%(section\>\|chapter\>\|part\>\|end{document}\)' fold contains=@texFoldGroup,@texSectionGroup,@Spell
268 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\n\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end{document}\)' fold contains=@texFoldGroup,@texSubSectionGroup,@Spell
269 syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\ze\n\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end{document}\)' fold contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
270 syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\ze\n\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end{document}\)' fold contains=@texFoldGroup,@texParaGroup,@Spell
271 syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\ze\n\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end{document}\)' 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
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\n\s*\\part\>' contains=@texFoldGroup,@texPartGroup,@Spell
277 syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\n\s*\\\%(chapter\|part\)\>' contains=@texFoldGroup,@texChapterGroup,@Spell
278 syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\n\s*\\\%(section\>\|chapter\>\|part\>\|end{document}\)' contains=@texFoldGroup,@texSectionGroup,@Spell
279 syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\n\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end{document}\)' contains=@texFoldGroup,@texSubSectionGroup,@Spell
280 syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\ze\n\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end{document}\)' contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
281 syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\ze\n\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end{document}\)' contains=@texFoldGroup,@texParaGroup,@Spell
282 syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\ze\n\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end{document}\)' 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
287 " Bad Math (mismatched): {{{1
288 if !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 "\\[\])]"
295 if !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
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'
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'
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)
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
345 syn match texMathOper "[_^=]" contained
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
361 " Special TeX characters ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
362 syn match texSpecialChar "\\[$&%#{}_]"
364 syn match texSpecialChar "\\[SP@][^a-zA-Z@]"me=e-1
366 syn match texSpecialChar "\\[SP@]\A"me=e-1
368 syn match texSpecialChar "\\\\"
369 if !exists("tex_no_math")
370 syn match texOnlyMath "[_^]"
372 syn match texSpecialChar "\^\^[0-9a-f]\{2}\|\^\^\S"
375 " Normal TeX LaTeX : %....
376 " Documented TeX Format: ^^A... -and- leading %s (only)
377 syn cluster texCommentGroup contains=texTodo,@Spell
379 syn keyword texTodo contained combak fixme todo xxx
381 if b:extfname == "dtx"
382 syn match texComment "\^\^A.*$" contains=@texCommentGroup
383 syn match texComment "^%\+" contains=@texCommentGroup
385 if g:tex_fold_enabled
386 " allows syntax-folding of 2 or more contiguous comment lines
387 " single-line comments are not folded
388 syn match texComment "%.*$" contains=@texCommentGroup
389 syn region texComment start="^\zs\s*%.*\_s*%" skip="^\s*%" end='^\ze\s*[^%]' fold
391 syn match texComment "%.*$" contains=@texCommentGroup
395 " Separate lines used for verb` and verb# so that the end conditions {{{1
396 " will appropriately terminate. Ideally vim would let me save a
397 " character from the start pattern and re-use it in the end-pattern.
398 syn region texZone start="\\begin{verbatim}" end="\\end{verbatim}\|%stopzone\>" contains=@Spell
400 syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>" contains=@Spell
402 syn region texZone start="\\begin{verbatimtab}" end="\\end{verbatimtab}\|%stopzone\>" contains=@Spell
403 syn region texZone start="\\begin{verbatimwrite}" end="\\end{verbatimwrite}\|%stopzone\>" contains=@Spell
404 syn region texZone start="\\begin{boxedverbatim}" end="\\end{boxedverbatim}\|%stopzone\>" contains=@Spell
406 syn region texZone start="\\verb\*\=`" end="`\|%stopzone\>"
407 syn region texZone start="\\verb\*\=#" end="#\|%stopzone\>"
410 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z@]\)" end="\z1\|%stopzone\>"
412 syn region texZone start="\\verb\*\=\z([^\ta-zA-Z]\)" end="\z1\|%stopzone\>"
416 " Tex Reference Zones: {{{1
417 syn region texZone matchgroup=texStatement start="@samp{" end="}\|%stopzone\>" contains=@texRefGroup
418 syn region texRefZone matchgroup=texStatement start="\\nocite{" end="}\|%stopzone\>" contains=@texRefGroup
419 syn region texRefZone matchgroup=texStatement start="\\bibliography{" end="}\|%stopzone\>" contains=@texRefGroup
420 syn region texRefZone matchgroup=texStatement start="\\label{" end="}\|%stopzone\>" contains=@texRefGroup
421 syn region texRefZone matchgroup=texStatement start="\\\(page\|eq\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
422 syn region texRefZone matchgroup=texStatement start="\\v\=ref{" end="}\|%stopzone\>" contains=@texRefGroup
423 syn match texRefZone '\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
424 syn region texRefOption contained matchgroup=Delimiter start='\[' end=']' contains=@texRefGroup nextgroup=texRefOption,texCite
425 syn region texCite contained matchgroup=Delimiter start='{' end='}' contains=@texRefGroup
427 " Handle newcommand, newenvironment : {{{1
428 syn match texNewCmd "\\newcommand\>" nextgroup=texCmdName skipwhite skipnl
429 syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
430 syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]" nextgroup=texCmdBody skipwhite skipnl
431 syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]" matchgroup=Delimiter end="}" contains=@texCmdGroup
432 syn match texNewEnv "\\newenvironment\>" nextgroup=texEnvName skipwhite skipnl
433 syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvBgn skipwhite skipnl
434 syn region texEnvBgn contained matchgroup=Delimiter start="{"rs=s+1 end="}" nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
435 syn region texEnvEnd contained matchgroup=Delimiter start="{"rs=s+1 end="}" skipwhite skipnl contains=@texEnvGroup
437 " Definitions/Commands: {{{1
438 syn match texDefCmd "\\def\>" nextgroup=texDefName skipwhite skipnl
440 syn match texDefName contained "\\[a-zA-Z@]\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
441 syn match texDefName contained "\\[^a-zA-Z@]" nextgroup=texDefParms,texCmdBody skipwhite skipnl
443 syn match texDefName contained "\\\a\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
444 syn match texDefName contained "\\\A" nextgroup=texDefParms,texCmdBody skipwhite skipnl
446 syn match texDefParms contained "#[^{]*" contains=texDefParm nextgroup=texCmdBody skipwhite skipnl
447 syn match texDefParm contained "#\d\+"
450 syn match texLength "\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
452 " TeX String Delimiters: {{{1
453 syn match texString "\(``\|''\|,,\)"
455 " LaTeX synchronization: {{{1
456 syn sync maxlines=200
459 syn sync match texSyncStop groupthere NONE "%stopzone\>"
461 " Synchronization: {{{1
462 " The $..$ and $$..$$ make for impossible sync patterns
463 " (one can't tell if a "$$" starts or stops a math zone by itself)
464 " The following grouptheres coupled with minlines above
465 " help improve the odds of good syncing.
466 if !exists("tex_no_math")
467 syn sync match texSyncMathZoneA groupthere NONE "\\end{abstract}"
468 syn sync match texSyncMathZoneA groupthere NONE "\\end{center}"
469 syn sync match texSyncMathZoneA groupthere NONE "\\end{description}"
470 syn sync match texSyncMathZoneA groupthere NONE "\\end{enumerate}"
471 syn sync match texSyncMathZoneA groupthere NONE "\\end{itemize}"
472 syn sync match texSyncMathZoneA groupthere NONE "\\end{table}"
473 syn sync match texSyncMathZoneA groupthere NONE "\\end{tabular}"
474 syn sync match texSyncMathZoneA groupthere NONE "\\\(sub\)*section\>"
478 if did_tex_syntax_inits == 1
479 let did_tex_syntax_inits= 2
480 " TeX highlighting groups which should share similar highlighting
481 if !exists("g:tex_no_error")
482 if !exists("tex_no_math")
483 HiLink texBadMath texError
484 HiLink texMathDelimBad texError
485 HiLink texMathError texError
487 HiLink texOnlyMath texError
490 HiLink texError Error
493 HiLink texCite texRefZone
494 HiLink texDefCmd texDef
495 HiLink texDefName texDef
496 HiLink texDocType texCmdName
497 HiLink texDocTypeArgs texCmdArgs
498 HiLink texInputFileOpt texCmdArgs
499 HiLink texInputCurlies texDelimiter
500 HiLink texLigature texSpecialChar
501 if !exists("tex_no_math")
502 HiLink texMathDelimSet1 texMathDelim
503 HiLink texMathDelimSet2 texMathDelim
504 HiLink texMathDelimKey texMathDelim
505 HiLink texMathMatcher texMath
506 HiLink texMathZoneW texMath
507 HiLink texMathZoneX texMath
508 HiLink texMathZoneY texMath
509 HiLink texMathZoneZ texMath
511 HiLink texSectionMarker texCmdName
512 HiLink texSectionName texSection
513 HiLink texSpaceCode texStatement
514 HiLink texTypeSize texType
515 HiLink texTypeStyle texType
517 " Basic TeX highlighting groups
518 HiLink texCmdArgs Number
519 HiLink texCmdName Statement
520 HiLink texComment Comment
521 HiLink texDef Statement
522 HiLink texDefParm Special
523 HiLink texDelimiter Delimiter
524 HiLink texInput Special
525 HiLink texInputFile Special
526 HiLink texLength Number
527 HiLink texMath Special
528 HiLink texMathDelim Statement
529 HiLink texMathOper Operator
530 HiLink texNewCmd Statement
531 HiLink texNewEnv Statement
532 HiLink texOption Number
533 HiLink texRefZone Special
534 HiLink texSection PreCondit
535 HiLink texSpaceCodeChar Special
536 HiLink texSpecialChar SpecialChar
537 HiLink texStatement Statement
538 HiLink texString String
541 HiLink texZone PreCondit
546 " Current Syntax: {{{1
548 let b:current_syntax = "tex"
549 " vim: ts=8 fdm=marker