1" Vim syntax file 2" Language: TeX 3" Maintainer: Dr. Charles E. Campbell, Jr. <[email protected]> 4" Last Change: Apr 14, 2010 5" Version: 47 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 setl 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 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 107syn cluster texRefGroup contains=texMatcher,texComment,texDelimiter 108if !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 118 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 128endif 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 138syn region texParen start="(" end=")" contains=@texMatchGroup,@Spell 139if !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 183syn region texSectionName matchgroup=Delimiter start="{" end="}" contained nextgroup=texSectionModifier contains=texComment 184syn region texSectionModifier matchgroup=Delimiter start="\[" end="]" contained contains=texComment 185 186" \documentclass, \documentstyle, \usepackage: {{{1 187syn match texDocType "\\documentclass\>\|\\documentstyle\>\|\\usepackage\>" nextgroup=texSectionName,texDocTypeArgs 188syn region texDocTypeArgs matchgroup=Delimiter start="\[" end="]" contained nextgroup=texSectionName contains=texComment 189 190" Preamble syntax-based folding support: {{{1 191if g:tex_fold_enabled && has("folding") 192 syn region texPreamble transparent fold start='\zs\\documentclass\>' end='\ze\\begin{document}' contains=texStyle,@texMatchGroup 193endif 194 195" TeX input: {{{1 196syn match texInput "\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7 contains=texStatement 197syn match texInputFile "\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt 198syn match texInputFile "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt 199syn match texInputCurlies "[{}]" contained 200syn region texInputFileOpt matchgroup=Delimiter start="\[" end="\]" contained contains=texComment 201 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 264if g:tex_fold_enabled && has("folding") 265 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 275else 276 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 286endif 287 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") 297 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2 298 " 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 304 if g:tex_fold_enabled 305 let foldcmd= " fold" 306 else 307 let foldcmd= "" 308 endif 309 exe "syn cluster texMathZones add=".grpname 310 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd 311 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*}"' 313 exe 'hi def link '.grpname.' texMath' 314 if a:starform 315 let grpname = "texMathZone".a:sfx.'S' 316 let syncname = "texSyncMathZone".a:sfx.'S' 317 exe "syn cluster texMathZones add=".grpname 318 exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd 319 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*}"' 321 exe 'hi def link '.grpname.' texMath' 322 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) 378if !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 383syn case ignore 384syn keyword texTodo contained combak fixme todo xxx 385syn case match 386if b:extfname == "dtx" 387 syn match texComment "\^\^A.*$" contains=@texCommentGroup 388 syn match texComment "^%\+" contains=@texCommentGroup 389else 390 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 398endif 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. 403syn region texZone start="\\begin{[vV]erbatim}" end="\\end{[vV]erbatim}\|%stopzone\>" contains=@Spell 404" 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 410if 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 422syn 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 425syn 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 428syn 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 431 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 455syn match texLength "\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>" 456 457" TeX String Delimiters: {{{1 458syn match texString "\(``\|''\|,,\)" 459 460" 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 468" 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 506 HiLink texCite texRefZone 507 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 519 HiLink texMathZoneV texMath 520 HiLink texMathZoneW texMath 521 HiLink texMathZoneX texMath 522 HiLink texMathZoneY texMath 523 HiLink texMathZoneV texMath 524 HiLink texMathZoneZ texMath 525 endif 526 HiLink texSectionMarker texCmdName 527 HiLink texSectionName texSection 528 HiLink texSpaceCode texStatement 529 HiLink texStyleStatement texStatement 530 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 566