1" Vim syntax file 2" Language: TeX 3" Maintainer: Dr. Charles E. Campbell, Jr. <[email protected]> 4" Last Change: Feb 28, 2006 5" Version: 32 6" URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax 7" 8" Notes: {{{1 9" 10" 1. If you have a \begin{verbatim} that appears to overrun its boundaries, 11" use %stopzone. 12" 13" 2. Run-on equations ($..$ and $$..$$, particularly) can also be stopped 14" by suitable use of %stopzone. 15" 16" 3. If you have a slow computer, you may wish to modify 17" 18" syn sync maxlines=200 19" syn sync minlines=50 20" 21" to values that are more to your liking. 22" 23" 4. There is no match-syncing for $...$ and $$...$$; hence large 24" equation blocks constructed that way may exhibit syncing problems. 25" (there's no difference between begin/end patterns) 26" 27" 5. If you have the variable "g:tex_no_error" defined then none of the 28" lexical error-checking will be done. 29" 30" ie. let g:tex_no_error=1 31 32" Version Clears: {{{1 33" For version 5.x: Clear all syntax items 34" For version 6.x: Quit when a syntax file was already loaded 35if version < 600 36 syntax clear 37elseif exists("b:current_syntax") 38 finish 39endif 40 41" Define the default highlighting. {{{1 42" For version 5.7 and earlier: only when not done already 43" For version 5.8 and later: only when an item doesn't have highlighting yet 44if version >= 508 || !exists("did_tex_syntax_inits") 45 let did_tex_syntax_inits = 1 46 if version < 508 47 command -nargs=+ HiLink hi link <args> 48 else 49 command -nargs=+ HiLink hi def link <args> 50 endif 51endif 52if exists("g:tex_tex") && !exists("g:tex_no_error") 53 let g:tex_no_error= 1 54endif 55 56" Determine whether or not to use "*.sty" mode {{{1 57" The user may override the normal determination by setting 58" g:tex_stylish to 1 (for "*.sty" mode) 59" or to 0 else (normal "*.tex" mode) 60" or on a buffer-by-buffer basis with b:tex_stylish 61let b:extfname=expand("%:e") 62if exists("g:tex_stylish") 63 let b:tex_stylish= g:tex_stylish 64elseif !exists("b:tex_stylish") 65 if b:extfname == "sty" || b:extfname == "cls" || b:extfname == "clo" || b:extfname == "dtx" || b:extfname == "ltx" 66 let b:tex_stylish= 1 67 else 68 let b:tex_stylish= 0 69 endif 70endif 71 72" handle folding {{{1 73if !exists("g:tex_fold_enabled") 74 let g:tex_fold_enabled= 0 75elseif g:tex_fold_enabled && !has("folding") 76 let g:tex_fold_enabled= 0 77 echomsg "Ignoring g:tex_fold_enabled=".g:tex_fold_enabled."; need to re-compile vim for +fold support" 78endif 79if g:tex_fold_enabled && &fdm == "manual" 80 set fdm=syntax 81endif 82 83" (La)TeX keywords: only use the letters a-zA-Z {{{1 84" but _ is the only one that causes problems. 85if version < 600 86 set isk-=_ 87 if b:tex_stylish 88 set isk+=@ 89 endif 90else 91 setlocal isk-=_ 92 if b:tex_stylish 93 setlocal isk+=@ 94 endif 95endif 96 97" Clusters: {{{1 98" -------- 99syn cluster texCmdGroup contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSectionMarker,texSectionName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle 100if !exists("g:tex_no_error") 101 syn cluster texCmdGroup add=texMathError 102endif 103syn cluster texEnvGroup contains=texMatcher,texMathDelim,texSpecialChar,texStatement 104syn cluster texFoldGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMatcher,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texSectionMarker,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract 105syn cluster texMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,@Spell 106syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter 107if !exists("tex_no_math") 108 syn cluster texMathZones contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ 109 syn cluster texMatchGroup add=@texMathZones 110 syn cluster texMathDelimGroup contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2 111 syn cluster texMathMatchGroup contains=@texMathZones,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathMatcher,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone 112 syn cluster texMathZoneGroup contains=texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle 113 if !exists("g:tex_no_error") 114 syn cluster texMathMatchGroup add=texMathError 115 syn cluster texMathZoneGroup add=texMathError 116 endif 117 syn cluster texMathZoneGroup add=@NoSpell 118 " following used in the \part \chapter \section \subsection \subsubsection 119 " \paragraph \subparagraph \author \title highlighting 120 syn cluster texDocGroup contains=texPartZone,@texPartGroup 121 syn cluster texPartGroup contains=texChapterZone,texSectionZone,texParaZone 122 syn cluster texChapterGroup contains=texSectionZone,texParaZone 123 syn cluster texSectionGroup contains=texSubSectionZone,texParaZone 124 syn cluster texSubSectionGroup contains=texSubSubSectionZone,texParaZone 125 syn cluster texSubSubSectionGroup contains=texParaZone 126 syn cluster texParaGroup contains=texSubParaZone 127endif 128 129" Try to flag {} and () mismatches: {{{1 130if !exists("g:tex_no_error") 131 syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texMatchGroup,texError 132 syn region texMatcher matchgroup=Delimiter start="\[" end="]" contains=@texMatchGroup,texError 133else 134 syn region texMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texMatchGroup 135 syn region texMatcher matchgroup=Delimiter start="\[" end="]" contains=@texMatchGroup 136endif 137syn region texParen start="(" end=")" contains=@texMatchGroup,@Spell 138if !exists("g:tex_no_error") 139 syn match texError "[}\])]" 140endif 141if !exists("tex_no_math") 142 if !exists("g:tex_no_error") 143 syn match texMathError "}" contained 144 endif 145 syn region texMathMatcher matchgroup=Delimiter start="{" skip="\\\\\|\\}" end="}" end="%stopzone\>" contained contains=@texMathMatchGroup 146endif 147 148" TeX/LaTeX keywords: {{{1 149" Instead of trying to be All Knowing, I just match \..alphameric.. 150" Note that *.tex files may not have "@" in their \commands 151if exists("g:tex_tex") || b:tex_stylish 152 syn match texStatement "\\[a-zA-Z@]\+" 153else 154 syn match texStatement "\\\a\+" 155 if !exists("g:tex_no_error") 156 syn match texError "\\\a*@[a-zA-Z@]*" 157 endif 158endif 159 160" TeX/LaTeX delimiters: {{{1 161syn match texDelimiter "&" 162syn match texDelimiter "\\\\" 163 164" Tex/Latex Options: {{{1 165syn match texOption "[^\\]\zs#\d\+\|^#\d\+" 166 167" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1 168if b:tex_stylish 169 syn match texAccent "\\[bcdvuH][^a-zA-Z@]"me=e-1 170 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1 171else 172 syn match texAccent "\\[bcdvuH]\A"me=e-1 173 syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1 174endif 175syn match texAccent "\\[bcdvuH]$" 176syn match texAccent +\\[=^.\~"`']+ 177syn match texAccent +\\['=t'.c^ud"vb~Hr]{\a}+ 178syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$" 179 180" \begin{}/\end{} section markers: {{{1 181syn match texSectionMarker "\\begin\>\|\\end\>" nextgroup=texSectionName 182syn region texSectionName matchgroup=Delimiter start="{" end="}" contained nextgroup=texSectionModifier 183syn region texSectionModifier matchgroup=Delimiter start="\[" end="]" contained 184 185" \documentclass, \documentstyle, \usepackage: {{{1 186syn match texDocType "\\documentclass\>\|\\documentstyle\>\|\\usepackage\>" nextgroup=texSectionName,texDocTypeArgs 187syn region texDocTypeArgs matchgroup=Delimiter start="\[" end="]" contained nextgroup=texSectionName 188 189" 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 258if g:tex_fold_enabled && has("folding") 259 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 269else 270 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 280endif 281 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") 291 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2 292 " 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 375 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 383endif 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. 388syn region texZone start="\\begin{verbatim}" end="\\end{verbatim}\|%stopzone\>" contains=@Spell 389if 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 401syn 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 404syn 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 407syn 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 410 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 477 HiLink texCite texRefZone 478 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 534