xref: /vim-8.2.3635/runtime/syntax/tex.vim (revision fc1421eb)
1" Vim syntax file
2" Language:	TeX
3" Maintainer:	Dr. Charles E. Campbell, Jr. <[email protected]>
4" Last Change:	Apr 18, 2006
5" Version:	35
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" Preamble syntax-based folding support: {{{1
190if g:tex_fold_enabled && has("folding")
191 syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=@texMatchGroup
192endif
193
194" TeX input: {{{1
195syn match texInput		"\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7				contains=texStatement
196syn match texInputFile		"\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}"	contains=texStatement,texInputCurlies
197syn match texInputFile		"\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"		contains=texStatement,texInputCurlies,texInputFileOpt
198syn match texInputCurlies	"[{}]"								contained
199syn region texInputFileOpt	matchgroup=Delimiter start="\[" end="\]"			contained
200
201" Type Styles (LaTeX 2.09): {{{1
202syn match texTypeStyle		"\\rm\>"
203syn match texTypeStyle		"\\em\>"
204syn match texTypeStyle		"\\bf\>"
205syn match texTypeStyle		"\\it\>"
206syn match texTypeStyle		"\\sl\>"
207syn match texTypeStyle		"\\sf\>"
208syn match texTypeStyle		"\\sc\>"
209syn match texTypeStyle		"\\tt\>"
210
211" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
212syn match texTypeStyle		"\\textbf\>"
213syn match texTypeStyle		"\\textit\>"
214syn match texTypeStyle		"\\textmd\>"
215syn match texTypeStyle		"\\textrm\>"
216syn match texTypeStyle		"\\textsc\>"
217syn match texTypeStyle		"\\textsf\>"
218syn match texTypeStyle		"\\textsl\>"
219syn match texTypeStyle		"\\texttt\>"
220syn match texTypeStyle		"\\textup\>"
221syn match texTypeStyle		"\\emph\>"
222
223syn match texTypeStyle		"\\mathbb\>"
224syn match texTypeStyle		"\\mathbf\>"
225syn match texTypeStyle		"\\mathcal\>"
226syn match texTypeStyle		"\\mathfrak\>"
227syn match texTypeStyle		"\\mathit\>"
228syn match texTypeStyle		"\\mathnormal\>"
229syn match texTypeStyle		"\\mathrm\>"
230syn match texTypeStyle		"\\mathsf\>"
231syn match texTypeStyle		"\\mathtt\>"
232
233syn match texTypeStyle		"\\rmfamily\>"
234syn match texTypeStyle		"\\sffamily\>"
235syn match texTypeStyle		"\\ttfamily\>"
236
237syn match texTypeStyle		"\\itshape\>"
238syn match texTypeStyle		"\\scshape\>"
239syn match texTypeStyle		"\\slshape\>"
240syn match texTypeStyle		"\\upshape\>"
241
242syn match texTypeStyle		"\\bfseries\>"
243syn match texTypeStyle		"\\mdseries\>"
244
245" Some type sizes: {{{1
246syn match texTypeSize		"\\tiny\>"
247syn match texTypeSize		"\\scriptsize\>"
248syn match texTypeSize		"\\footnotesize\>"
249syn match texTypeSize		"\\small\>"
250syn match texTypeSize		"\\normalsize\>"
251syn match texTypeSize		"\\large\>"
252syn match texTypeSize		"\\Large\>"
253syn match texTypeSize		"\\LARGE\>"
254syn match texTypeSize		"\\huge\>"
255syn match texTypeSize		"\\Huge\>"
256
257" Spacecodes (TeX'isms): {{{1
258" \mathcode`\^^@="2201  \delcode`\(="028300  \sfcode`\)=0 \uccode`X=`X  \lccode`x=`x
259syn match texSpaceCode		"\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
260syn match texSpaceCodeChar    "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)"	contained
261
262" Sections, subsections, etc: {{{1
263if 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 keepend contains=@texFoldGroup,@texDocGroup,@Spell
265 syn region texPartZone			matchgroup=texSection start='\\part\>'			 end='\n\ze\s*\\part\>'		fold keepend contains=@texFoldGroup,@texPartGroup,@Spell
266 syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\n\ze\s*\\chapter\>'	fold keepend contains=@texFoldGroup,@texChapterGroup,@Spell
267 syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\n\ze\s*\\section\>'	fold keepend contains=@texFoldGroup,@texSectionGroup,@Spell
268 syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\n\ze\s*\\subsection\>'	fold keepend contains=@texFoldGroup,@texSubSectionGroup,@Spell
269 syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		end='\n\ze\s*\\subsubsection\>'	fold keepend contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
270 syn region texParaZone			matchgroup=texSection start='\\paragraph\>'		 end='\n\ze\s*\\paragraph\>'	fold keepend contains=@texFoldGroup,@texParaGroup,@Spell
271 syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\n\ze\s*\\subparagraph\>'	fold keepend 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
274else
275 syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'	keepend contains=@texFoldGroup,@texDocGroup,@Spell
276 syn region texPartZone			matchgroup=texSection start='\\part\>'			 end='\n\ze\s*\\part\>'		keepend contains=@texFoldGroup,@texPartGroup,@Spell
277 syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\n\ze\s*\\chapter\>'	keepend contains=@texFoldGroup,@texChapterGroup,@Spell
278 syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\n\ze\s*\\section\>'	keepend contains=@texFoldGroup,@texSectionGroup,@Spell
279 syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\n\ze\s*\\subsection\>'	keepend contains=@texFoldGroup,@texSubSectionGroup,@Spell
280 syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		end='\n\ze\s*\\subsubsection\>'	keepend contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
281 syn region texParaZone			matchgroup=texSection start='\\paragraph\>'		 end='\n\ze\s*\\paragraph\>'	keepend contains=@texFoldGroup,@texParaGroup,@Spell
282 syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\n\ze\s*\\subparagraph\>'	keepend 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
285endif
286
287" Bad Math (mismatched): {{{1
288if !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		"\\[\])]"
292endif
293
294" Math Zones: {{{1
295if !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   exe "syn cluster texMathZones add=".grpname
304   exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'
305   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
306   exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
307   exe 'HiLink '.grpname.' texMath'
308   if a:starform
309    let grpname  = "texMathZone".a:sfx.'S'
310    let syncname = "texSyncMathZone".a:sfx.'S'
311    exe "syn cluster texMathZones add=".grpname
312    exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'
313    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
314    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
315    exe 'HiLink '.grpname.' texMath'
316   endif
317 endfun
318
319 " Standard Math Zones: {{{2
320 call TexNewMathZone("A","align",1)
321 call TexNewMathZone("B","alignat",1)
322 call TexNewMathZone("C","displaymath",1)
323 call TexNewMathZone("D","eqnarray",1)
324 call TexNewMathZone("E","equation",1)
325 call TexNewMathZone("F","flalign",1)
326 call TexNewMathZone("G","gather",1)
327 call TexNewMathZone("H","math",1)
328 call TexNewMathZone("I","multline",1)
329 call TexNewMathZone("J","subequations",0)
330 call TexNewMathZone("K","xalignat",1)
331 call TexNewMathZone("L","xxalignat",0)
332
333 " Inline Math Zones: {{{2
334 syn region texMathZoneV	matchgroup=Delimiter start="\\("	matchgroup=Delimiter end="\\)\|%stopzone\>"	keepend contains=@texMathZoneGroup
335 syn region texMathZoneW	matchgroup=Delimiter start="\\\["	matchgroup=Delimiter end="\\]\|%stopzone\>"	keepend contains=@texMathZoneGroup
336 syn region texMathZoneX	matchgroup=Delimiter start="\$" skip="\\\\\|\\\$" matchgroup=Delimiter end="\$" end="%stopzone\>"	contains=@texMathZoneGroup
337 syn region texMathZoneY	matchgroup=Delimiter start="\$\$" matchgroup=Delimiter end="\$\$" end="%stopzone\>"	keepend		contains=@texMathZoneGroup
338 syn region texMathZoneZ	matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>"	contains=@texMathZoneGroup
339
340 syn match texMathOper		"[_^=]" contained
341
342 " \left..something.. and \right..something.. support: {{{2
343 syn match   texMathDelimBad	contained		"\S"
344 syn match   texMathDelim	contained		"\\\(left\|right\|[bB]igg\=[lr]\)\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
345 syn match   texMathDelim	contained		"\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
346 syn match   texMathDelim	contained		"\\lefteqn\>"
347 syn match   texMathDelimSet2	contained	"\\"		nextgroup=texMathDelimKey,texMathDelimBad
348 syn match   texMathDelimSet1	contained	"[<>()[\]|/.]\|\\[{}|]"
349 syn keyword texMathDelimKey	contained	backslash       lceil           lVert           rgroup          uparrow
350 syn keyword texMathDelimKey	contained	downarrow       lfloor          rangle          rmoustache      Uparrow
351 syn keyword texMathDelimKey	contained	Downarrow       lgroup          rbrace          rvert           updownarrow
352 syn keyword texMathDelimKey	contained	langle          lmoustache      rceil           rVert           Updownarrow
353 syn keyword texMathDelimKey	contained	lbrace          lvert           rfloor
354endif
355
356" Special TeX characters  ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
357syn match texSpecialChar	"\\[$&%#{}_]"
358if b:tex_stylish
359  syn match texSpecialChar	"\\[SP@][^a-zA-Z@]"me=e-1
360else
361  syn match texSpecialChar	"\\[SP@]\A"me=e-1
362endif
363syn match texSpecialChar	"\\\\"
364if !exists("tex_no_math")
365 syn match texOnlyMath		"[_^]"
366endif
367syn match texSpecialChar	"\^\^[0-9a-f]\{2}\|\^\^\S"
368
369" Comments: {{{1
370"    Normal TeX LaTeX     :   %....
371"    Documented TeX Format:  ^^A...	-and-	leading %s (only)
372syn cluster texCommentGroup	contains=texTodo,@Spell
373syn case ignore
374syn keyword texTodo		contained		combak	fixme	todo	xxx
375syn case match
376if b:extfname == "dtx"
377  syn match texComment		"\^\^A.*$"	contains=@texCommentGroup
378  syn match texComment		"^%\+"		contains=@texCommentGroup
379else
380  if g:tex_fold_enabled
381   " allows syntax-folding of 2 or more contiguous comment lines
382   " single-line comments are not folded
383   syn match  texComment	"%.*$"		contains=@texCommentGroup
384   syn region texComment	start="^\zs\s*%.*\_s*%"	skip="^\s*%"	end='^\ze\s*[^%]' fold
385  else
386   syn match texComment		"%.*$"		contains=@texCommentGroup
387  endif
388endif
389
390" Separate lines used for verb` and verb# so that the end conditions {{{1
391" will appropriately terminate.  Ideally vim would let me save a
392" character from the start pattern and re-use it in the end-pattern.
393syn region texZone		start="\\begin{verbatim}"		end="\\end{verbatim}\|%stopzone\>"	contains=@Spell
394" listings package:
395syn region texZone		start="\\begin{lstlisting}"		end="\\end{lstlisting}\|%stopzone\>"	contains=@Spell
396" moreverb package:
397syn region texZone		start="\\begin{verbatimtab}"		end="\\end{verbatimtab}\|%stopzone\>"	contains=@Spell
398syn region texZone		start="\\begin{verbatimwrite}"		end="\\end{verbatimwrite}\|%stopzone\>"	contains=@Spell
399syn region texZone		start="\\begin{boxedverbatim}"		end="\\end{boxedverbatim}\|%stopzone\>"	contains=@Spell
400if version < 600
401 syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"
402 syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"
403else
404  if b:tex_stylish
405    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z@]\)"	end="\z1\|%stopzone\>"
406  else
407    syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z]\)"	end="\z1\|%stopzone\>"
408  endif
409endif
410
411" Tex Reference Zones: {{{1
412syn region texZone		matchgroup=texStatement start="@samp{"			end="}\|%stopzone\>"	contains=@texRefGroup
413syn region texRefZone		matchgroup=texStatement start="\\nocite{"		end="}\|%stopzone\>"	contains=@texRefGroup
414syn region texRefZone		matchgroup=texStatement start="\\bibliography{"		end="}\|%stopzone\>"	contains=@texRefGroup
415syn region texRefZone		matchgroup=texStatement start="\\label{"		end="}\|%stopzone\>"	contains=@texRefGroup
416syn region texRefZone		matchgroup=texStatement start="\\\(page\|eq\)ref{"	end="}\|%stopzone\>"	contains=@texRefGroup
417syn region texRefZone		matchgroup=texStatement start="\\v\=ref{"		end="}\|%stopzone\>"	contains=@texRefGroup
418syn match  texRefZone		'\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
419syn region texRefOption	contained	matchgroup=Delimiter start='\[' end=']'		contains=@texRefGroup	nextgroup=texRefOption,texCite
420syn region texCite	contained	matchgroup=Delimiter start='{' end='}'		contains=@texRefGroup
421
422" Handle newcommand, newenvironment : {{{1
423syn match  texNewCmd				"\\newcommand\>"			nextgroup=texCmdName skipwhite skipnl
424syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
425syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]"		nextgroup=texCmdBody skipwhite skipnl
426syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]"	matchgroup=Delimiter end="}" contains=@texCmdGroup
427syn match  texNewEnv				"\\newenvironment\>"			nextgroup=texEnvName skipwhite skipnl
428syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvBgn skipwhite skipnl
429syn region texEnvBgn  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
430syn region texEnvEnd  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		skipwhite skipnl contains=@texEnvGroup
431
432" Definitions/Commands: {{{1
433syn match texDefCmd				"\\def\>"				nextgroup=texDefName skipwhite skipnl
434if b:tex_stylish
435  syn match texDefName contained		"\\[a-zA-Z@]\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
436  syn match texDefName contained		"\\[^a-zA-Z@]"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
437else
438  syn match texDefName contained		"\\\a\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
439  syn match texDefName contained		"\\\A"					nextgroup=texDefParms,texCmdBody skipwhite skipnl
440endif
441syn match texDefParms  contained		"#[^{]*"	contains=texDefParm	nextgroup=texCmdBody skipwhite skipnl
442syn match  texDefParm  contained		"#\d\+"
443
444" TeX Lengths: {{{1
445syn match  texLength		"\<\d\+\(\.\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
446
447" TeX String Delimiters: {{{1
448syn match texString		"\(``\|''\|,,\)"
449
450" LaTeX synchronization: {{{1
451syn sync maxlines=200
452syn sync minlines=50
453
454syn  sync match texSyncStop			groupthere NONE		"%stopzone\>"
455
456" Synchronization: {{{1
457" The $..$ and $$..$$ make for impossible sync patterns
458" (one can't tell if a "$$" starts or stops a math zone by itself)
459" The following grouptheres coupled with minlines above
460" help improve the odds of good syncing.
461if !exists("tex_no_math")
462 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{abstract}"
463 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{center}"
464 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{description}"
465 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{enumerate}"
466 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{itemize}"
467 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{table}"
468 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{tabular}"
469 syn sync match texSyncMathZoneA		groupthere NONE		"\\\(sub\)*section\>"
470endif
471
472" Highlighting: {{{1
473if did_tex_syntax_inits == 1
474 let did_tex_syntax_inits= 2
475  " TeX highlighting groups which should share similar highlighting
476  if !exists("g:tex_no_error")
477   if !exists("tex_no_math")
478    HiLink texBadMath		texError
479    HiLink texMathDelimBad	texError
480    HiLink texMathError		texError
481    if !b:tex_stylish
482      HiLink texOnlyMath	texError
483    endif
484   endif
485   HiLink texError		Error
486  endif
487
488  HiLink texCite		texRefZone
489  HiLink texDefCmd		texDef
490  HiLink texDefName		texDef
491  HiLink texDocType		texCmdName
492  HiLink texDocTypeArgs		texCmdArgs
493  HiLink texInputFileOpt	texCmdArgs
494  HiLink texInputCurlies	texDelimiter
495  HiLink texLigature		texSpecialChar
496  if !exists("tex_no_math")
497   HiLink texMathDelimSet1	texMathDelim
498   HiLink texMathDelimSet2	texMathDelim
499   HiLink texMathDelimKey	texMathDelim
500   HiLink texMathMatcher	texMath
501   HiLink texMathZoneW		texMath
502   HiLink texMathZoneX		texMath
503   HiLink texMathZoneY		texMath
504   HiLink texMathZoneZ		texMath
505  endif
506  HiLink texSectionMarker	texCmdName
507  HiLink texSectionName		texSection
508  HiLink texSpaceCode		texStatement
509  HiLink texTypeSize		texType
510  HiLink texTypeStyle		texType
511
512   " Basic TeX highlighting groups
513  HiLink texCmdArgs		Number
514  HiLink texCmdName		Statement
515  HiLink texComment		Comment
516  HiLink texDef			Statement
517  HiLink texDefParm		Special
518  HiLink texDelimiter		Delimiter
519  HiLink texInput		Special
520  HiLink texInputFile		Special
521  HiLink texLength		Number
522  HiLink texMath		Special
523  HiLink texMathDelim		Statement
524  HiLink texMathOper		Operator
525  HiLink texNewCmd		Statement
526  HiLink texNewEnv		Statement
527  HiLink texOption		Number
528  HiLink texRefZone		Special
529  HiLink texSection		PreCondit
530  HiLink texSpaceCodeChar	Special
531  HiLink texSpecialChar		SpecialChar
532  HiLink texStatement		Statement
533  HiLink texString		String
534  HiLink texTodo		Todo
535  HiLink texType		Type
536  HiLink texZone		PreCondit
537
538  delcommand HiLink
539endif
540
541" Current Syntax: {{{1
542unlet b:extfname
543let   b:current_syntax = "tex"
544" vim: ts=8 fdm=marker
545