xref: /vim-8.2.3635/runtime/syntax/tex.vim (revision dee2e315)
1" Vim syntax file
2" Language:	TeX
3" Maintainer:	Charles E. Campbell <[email protected]>
4" Last Change:	Mar 11, 2013
5" Version:	78
6" URL:		http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
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
40let s:keepcpo= &cpo
41set cpo&vim
42scriptencoding utf-8
43
44" Define the default highlighting. {{{1
45" For version 5.7 and earlier: only when not done already
46" For version 5.8 and later: only when an item doesn't have highlighting yet
47if version >= 508 || !exists("did_tex_syntax_inits")
48 let did_tex_syntax_inits = 1
49 if version < 508
50  command -nargs=+ HiLink hi link <args>
51 else
52  command -nargs=+ HiLink hi def link <args>
53 endif
54endif
55if exists("g:tex_no_error") && g:tex_no_error
56 let s:tex_no_error= 1
57endif
58
59" by default, enable all region-based highlighting
60let s:tex_fast= "bcmMprsSvV"
61if exists("g:tex_fast")
62 if type(g:tex_fast) != 1
63  " g:tex_fast exists and is not a string, so
64  " turn off all optional region-based highighting
65  let s:tex_fast= ""
66 else
67  let s:tex_fast= g:tex_fast
68 endif
69 let s:tex_no_error= 1
70else
71 let s:tex_fast= "bcmMprsSvV"
72endif
73
74" let user determine which classes of concealment will be supported
75"   a=accents/ligatures d=delimiters m=math symbols  g=Greek  s=superscripts/subscripts
76if !exists("g:tex_conceal")
77 let s:tex_conceal= 'abdmgs'
78else
79 let s:tex_conceal= g:tex_conceal
80endif
81
82" Determine whether or not to use "*.sty" mode {{{1
83" The user may override the normal determination by setting
84"   g:tex_stylish to 1      (for    "*.sty" mode)
85"    or to           0 else (normal "*.tex" mode)
86" or on a buffer-by-buffer basis with b:tex_stylish
87let s:extfname=expand("%:e")
88if exists("g:tex_stylish")
89 let b:tex_stylish= g:tex_stylish
90elseif !exists("b:tex_stylish")
91 if s:extfname == "sty" || s:extfname == "cls" || s:extfname == "clo" || s:extfname == "dtx" || s:extfname == "ltx"
92  let b:tex_stylish= 1
93 else
94  let b:tex_stylish= 0
95 endif
96endif
97
98" handle folding {{{1
99if !exists("g:tex_fold_enabled")
100 let g:tex_fold_enabled= 0
101elseif g:tex_fold_enabled && !has("folding")
102 let g:tex_fold_enabled= 0
103 echomsg "Ignoring g:tex_fold_enabled=".g:tex_fold_enabled."; need to re-compile vim for +fold support"
104endif
105if g:tex_fold_enabled && &fdm == "manual"
106 setl fdm=syntax
107endif
108
109" (La)TeX keywords: uses the characters 0-9,a-z,A-Z,192-255 only... {{{1
110" but _ is the only one that causes problems.
111" One may override this iskeyword setting by providing
112" g:tex_isk
113if exists("g:tex_isk")
114 exe "setlocal isk=".g:tex_isk
115else
116 setlocal isk=48-57,a-z,A-Z,192-255
117endif
118if b:tex_stylish
119  setlocal isk+=@-@
120endif
121if exists("g:tex_nospell") && g:tex_nospell && !exists("g:tex_comment_nospell")
122 let g:tex_comment_nospell= 1
123endif
124
125" Clusters: {{{1
126" --------
127syn cluster texCmdGroup		contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texBeginEnd,texBeginEndName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle
128if !exists("s:tex_no_error")
129 syn cluster texCmdGroup	add=texMathError
130endif
131syn cluster texEnvGroup		contains=texMatcher,texMathDelim,texSpecialChar,texStatement
132syn 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,texBeginEnd,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract,texBoldStyle,texItalStyle,texNoSpell
133syn cluster texBoldGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMatcher,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texBeginEnd,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract,texBoldStyle,texBoldItalStyle,texNoSpell
134syn cluster texItalGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMatcher,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texBeginEnd,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract,texItalStyle,texItalBoldStyle,texNoSpell
135if !exists("g:tex_nospell") || !g:tex_nospell
136 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
137 syn 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
138else
139 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
140 syn 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,texStyleMatcher
141endif
142syn cluster texPreambleMatchGroup	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
143syn cluster texRefGroup		contains=texMatcher,texComment,texDelimiter
144if !exists("tex_no_math")
145 syn cluster texMathZones	contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
146 syn cluster texMatchGroup	add=@texMathZones
147 syn cluster texMathDelimGroup	contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2
148 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
149 syn cluster texMathZoneGroup	contains=texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texMathSymbol,texMathText,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle
150 if !exists("s:tex_no_error")
151  syn cluster texMathMatchGroup	add=texMathError
152  syn cluster texMathZoneGroup	add=texMathError
153 endif
154 syn cluster texMathZoneGroup add=@NoSpell
155 " following used in the \part \chapter \section \subsection \subsubsection
156 " \paragraph \subparagraph \author \title highlighting
157 syn cluster texDocGroup		contains=texPartZone,@texPartGroup
158 syn cluster texPartGroup		contains=texChapterZone,texSectionZone,texParaZone
159 syn cluster texChapterGroup		contains=texSectionZone,texParaZone
160 syn cluster texSectionGroup		contains=texSubSectionZone,texParaZone
161 syn cluster texSubSectionGroup		contains=texSubSubSectionZone,texParaZone
162 syn cluster texSubSubSectionGroup	contains=texParaZone
163 syn cluster texParaGroup		contains=texSubParaZone
164 if has("conceal") && &enc == 'utf-8'
165  syn cluster texMathZoneGroup	add=texGreek,texSuperscript,texSubscript,texMathSymbol
166  syn cluster texMathMatchGroup	add=texGreek,texSuperscript,texSubscript,texMathSymbol
167 endif
168endif
169
170" Try to flag {} and () mismatches: {{{1
171if s:tex_fast =~ 'm'
172  if !exists("s:tex_no_error")
173   syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texMatchGroup,texError
174   syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texMatchGroup,texError,@NoSpell
175  else
176   syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texMatchGroup
177   syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texMatchGroup
178  endif
179  if !exists("g:tex_nospell") || !g:tex_nospell
180   syn region texParen		start="("						end=")"		contains=@texMatchGroup,@Spell
181  else
182   syn region texParen		start="("						end=")"		contains=@texMatchGroup
183  endif
184endif
185if !exists("s:tex_no_error")
186 syn match  texError		"[}\])]"
187endif
188if s:tex_fast =~ 'M'
189  if !exists("tex_no_math")
190   if !exists("s:tex_no_error")
191    syn match  texMathError	"}"	contained
192   endif
193   syn region texMathMatcher	matchgroup=Delimiter	start="{"          skip="\\\\\|\\}"     end="}" end="%stopzone\>"	contained contains=@texMathMatchGroup
194  endif
195endif
196
197" TeX/LaTeX keywords: {{{1
198" Instead of trying to be All Knowing, I just match \..alphameric..
199" Note that *.tex files may not have "@" in their \commands
200if exists("g:tex_tex") || b:tex_stylish
201  syn match texStatement	"\\[a-zA-Z@]\+"
202else
203  syn match texStatement	"\\\a\+"
204  if !exists("s:tex_no_error")
205   syn match texError		"\\\a*@[a-zA-Z@]*"
206  endif
207endif
208
209" TeX/LaTeX delimiters: {{{1
210syn match texDelimiter		"&"
211syn match texDelimiter		"\\\\"
212syn match texDelimiter		"[{}]"
213
214" Tex/Latex Options: {{{1
215syn match texOption		"[^\\]\zs#\d\+\|^#\d\+"
216
217" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
218if b:tex_stylish
219  syn match texAccent		"\\[bcdvuH][^a-zA-Z@]"me=e-1
220  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
221else
222  syn match texAccent		"\\[bcdvuH]\A"me=e-1
223  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
224endif
225syn match texAccent		"\\[bcdvuH]$"
226syn match texAccent		+\\[=^.\~"`']+
227syn match texAccent		+\\['=t'.c^ud"vb~Hr]{\a}+
228syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
229
230" \begin{}/\end{} section markers: {{{1
231syn match  texBeginEnd		"\\begin\>\|\\end\>" nextgroup=texBeginEndName
232if s:tex_fast =~ 'm'
233  syn region texBeginEndName	matchgroup=Delimiter	start="{"		end="}"	contained	nextgroup=texBeginEndModifier	contains=texComment
234  syn region texBeginEndModifier	matchgroup=Delimiter	start="\["		end="]"	contained	contains=texComment,@NoSpell
235endif
236
237" \documentclass, \documentstyle, \usepackage: {{{1
238syn match  texDocType		"\\documentclass\>\|\\documentstyle\>\|\\usepackage\>"	nextgroup=texBeginEndName,texDocTypeArgs
239if s:tex_fast =~ 'm'
240  syn region texDocTypeArgs	matchgroup=Delimiter start="\[" end="]"			contained	nextgroup=texBeginEndName	contains=texComment,@NoSpell
241endif
242
243" Preamble syntax-based folding support: {{{1
244if g:tex_fold_enabled && has("folding")
245 syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=texStyle,@texPreambleMatchGroup
246endif
247
248" TeX input: {{{1
249syn match texInput		"\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7				contains=texStatement
250syn match texInputFile		"\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}"	contains=texStatement,texInputCurlies,texInputFileOpt
251syn match texInputFile		"\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"		contains=texStatement,texInputCurlies,texInputFileOpt
252syn match texInputCurlies	"[{}]"								contained
253if s:tex_fast =~ 'm'
254 syn region texInputFileOpt	matchgroup=Delimiter start="\[" end="\]"			contained	contains=texComment
255endif
256
257" Type Styles (LaTeX 2.09): {{{1
258syn match texTypeStyle		"\\rm\>"
259syn match texTypeStyle		"\\em\>"
260syn match texTypeStyle		"\\bf\>"
261syn match texTypeStyle		"\\it\>"
262syn match texTypeStyle		"\\sl\>"
263syn match texTypeStyle		"\\sf\>"
264syn match texTypeStyle		"\\sc\>"
265syn match texTypeStyle		"\\tt\>"
266
267" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
268if s:tex_conceal !~ 'b'
269 syn match texTypeStyle		"\\textbf\>"
270 syn match texTypeStyle		"\\textit\>"
271endif
272syn match texTypeStyle		"\\textmd\>"
273syn match texTypeStyle		"\\textrm\>"
274syn match texTypeStyle		"\\textsc\>"
275syn match texTypeStyle		"\\textsf\>"
276syn match texTypeStyle		"\\textsl\>"
277syn match texTypeStyle		"\\texttt\>"
278syn match texTypeStyle		"\\textup\>"
279syn match texTypeStyle		"\\emph\>"
280
281syn match texTypeStyle		"\\mathbb\>"
282syn match texTypeStyle		"\\mathbf\>"
283syn match texTypeStyle		"\\mathcal\>"
284syn match texTypeStyle		"\\mathfrak\>"
285syn match texTypeStyle		"\\mathit\>"
286syn match texTypeStyle		"\\mathnormal\>"
287syn match texTypeStyle		"\\mathrm\>"
288syn match texTypeStyle		"\\mathsf\>"
289syn match texTypeStyle		"\\mathtt\>"
290
291syn match texTypeStyle		"\\rmfamily\>"
292syn match texTypeStyle		"\\sffamily\>"
293syn match texTypeStyle		"\\ttfamily\>"
294
295syn match texTypeStyle		"\\itshape\>"
296syn match texTypeStyle		"\\scshape\>"
297syn match texTypeStyle		"\\slshape\>"
298syn match texTypeStyle		"\\upshape\>"
299
300syn match texTypeStyle		"\\bfseries\>"
301syn match texTypeStyle		"\\mdseries\>"
302
303" Some type sizes: {{{1
304syn match texTypeSize		"\\tiny\>"
305syn match texTypeSize		"\\scriptsize\>"
306syn match texTypeSize		"\\footnotesize\>"
307syn match texTypeSize		"\\small\>"
308syn match texTypeSize		"\\normalsize\>"
309syn match texTypeSize		"\\large\>"
310syn match texTypeSize		"\\Large\>"
311syn match texTypeSize		"\\LARGE\>"
312syn match texTypeSize		"\\huge\>"
313syn match texTypeSize		"\\Huge\>"
314
315" Spacecodes (TeX'isms): {{{1
316" \mathcode`\^^@="2201  \delcode`\(="028300  \sfcode`\)=0 \uccode`X=`X  \lccode`x=`x
317syn match texSpaceCode		"\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
318syn match texSpaceCodeChar    "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)"	contained
319
320" Sections, subsections, etc: {{{1
321if s:tex_fast =~ 'p'
322  if !exists("g:tex_nospell") || !g:tex_nospell
323   if g:tex_fold_enabled && has("folding")
324    syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											fold contains=@texFoldGroup,@texDocGroup,@Spell
325    syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								fold contains=@texFoldGroup,@texPartGroup,@Spell
326    syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							fold contains=@texFoldGroup,@texChapterGroup,@Spell
327    syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					fold contains=@texFoldGroup,@texSectionGroup,@Spell
328    syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				fold contains=@texFoldGroup,@texSubSectionGroup,@Spell
329    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
330    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
331    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
332    syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													fold contains=@texFoldGroup,@Spell
333    syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											fold contains=@texFoldGroup,@Spell
334   else
335    syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											contains=@texFoldGroup,@texDocGroup,@Spell
336    syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								contains=@texFoldGroup,@texPartGroup,@Spell
337    syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							contains=@texFoldGroup,@texChapterGroup,@Spell
338    syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					contains=@texFoldGroup,@texSectionGroup,@Spell
339    syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSectionGroup,@Spell
340    syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
341    syn region texParaZone		matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			contains=@texFoldGroup,@texParaGroup,@Spell
342    syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	contains=@texFoldGroup,@Spell
343    syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													contains=@texFoldGroup,@Spell
344    syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											contains=@texFoldGroup,@Spell
345   endif
346  else
347   if g:tex_fold_enabled && has("folding")
348    syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											fold contains=@texFoldGroup,@texDocGroup
349    syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								fold contains=@texFoldGroup,@texPartGroup
350    syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							fold contains=@texFoldGroup,@texChapterGroup
351    syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					fold contains=@texFoldGroup,@texSectionGroup
352    syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				fold contains=@texFoldGroup,@texSubSectionGroup
353    syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				fold contains=@texFoldGroup,@texSubSubSectionGroup
354    syn region texParaZone		matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			fold contains=@texFoldGroup,@texParaGroup
355    syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	fold contains=@texFoldGroup
356    syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													fold contains=@texFoldGroup
357    syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											fold contains=@texFoldGroup
358   else
359    syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											contains=@texFoldGroup,@texDocGroup
360    syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								contains=@texFoldGroup,@texPartGroup
361    syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							contains=@texFoldGroup,@texChapterGroup
362    syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					contains=@texFoldGroup,@texSectionGroup
363    syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSectionGroup
364    syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSubSectionGroup
365    syn region texParaZone		matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			contains=@texFoldGroup,@texParaGroup
366    syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	contains=@texFoldGroup
367    syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													contains=@texFoldGroup
368    syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											contains=@texFoldGroup
369   endif
370  endif
371endif
372
373" particular support for bold and italic {{{1
374if s:tex_fast =~ 'b'
375  if s:tex_conceal =~ 'b'
376   syn region texBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" end="}" concealends contains=@texBoldGroup
377   syn region texBoldItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" end="}" concealends contains=@texItalGroup
378   syn region texItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" end="}" concealends contains=@texItalGroup
379   syn region texItalBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" end="}" concealends contains=@texBoldGroup
380  endif
381endif
382
383" Bad Math (mismatched): {{{1
384if !exists("g:tex_no_math") && !exists("s:tex_no_error")
385 syn match texBadMath		"\\end\s*{\s*\(array\|gathered\|bBpvV]matrix\|split\|subequations\|smallmatrix\|xxalignat\)\s*}"
386 syn match texBadMath		"\\end\s*{\s*\(align\|alignat\|displaymath\|displaymath\|eqnarray\|equation\|flalign\|gather\|math\|multline\|xalignat\)\*\=\s*}"
387 syn match texBadMath		"\\[\])]"
388endif
389
390" Math Zones: {{{1
391if !exists("tex_no_math")
392 " TexNewMathZone: function creates a mathzone with the given suffix and mathzone name. {{{2
393 "                 Starred forms are created if starform is true.  Starred
394 "                 forms have syntax group and synchronization groups with a
395 "                 "S" appended.  Handles: cluster, syntax, sync, and HiLink.
396 fun! TexNewMathZone(sfx,mathzone,starform)
397   let grpname  = "texMathZone".a:sfx
398   let syncname = "texSyncMathZone".a:sfx
399   if g:tex_fold_enabled
400    let foldcmd= " fold"
401   else
402    let foldcmd= ""
403   endif
404   exe "syn cluster texMathZones add=".grpname
405   if s:tex_fast =~ 'M'
406    exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
407    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
408    exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
409   endif
410   exe 'hi def link '.grpname.' texMath'
411   if a:starform
412    let grpname  = "texMathZone".a:sfx.'S'
413    let syncname = "texSyncMathZone".a:sfx.'S'
414    exe "syn cluster texMathZones add=".grpname
415    if s:tex_fast =~ 'M'
416     exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
417     exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
418     exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
419    endif
420    exe 'hi def link '.grpname.' texMath'
421   endif
422 endfun
423
424 " Standard Math Zones: {{{2
425 call TexNewMathZone("A","align",1)
426 call TexNewMathZone("B","alignat",1)
427 call TexNewMathZone("C","displaymath",1)
428 call TexNewMathZone("D","eqnarray",1)
429 call TexNewMathZone("E","equation",1)
430 call TexNewMathZone("F","flalign",1)
431 call TexNewMathZone("G","gather",1)
432 call TexNewMathZone("H","math",1)
433 call TexNewMathZone("I","multline",1)
434 call TexNewMathZone("J","subequations",0)
435 call TexNewMathZone("K","xalignat",1)
436 call TexNewMathZone("L","xxalignat",0)
437
438 " Inline Math Zones: {{{2
439 if s:tex_fast =~ 'M'
440  if has("conceal") && &enc == 'utf-8' && s:tex_conceal =~ 'd'
441   syn region texMathZoneV	matchgroup=Delimiter start="\\("			matchgroup=Delimiter end="\\)\|%stopzone\>"	keepend concealends contains=@texMathZoneGroup
442   syn region texMathZoneW	matchgroup=Delimiter start="\\\["			matchgroup=Delimiter end="\\]\|%stopzone\>"	keepend concealends contains=@texMathZoneGroup
443   syn region texMathZoneX	matchgroup=Delimiter start="\$" skip="\\\\\|\\\$"	matchgroup=Delimiter end="\$" end="%stopzone\>"		concealends contains=@texMathZoneGroup
444   syn region texMathZoneY	matchgroup=Delimiter start="\$\$" 			matchgroup=Delimiter end="\$\$" end="%stopzone\>"	concealends keepend		contains=@texMathZoneGroup
445  else
446   syn region texMathZoneV	matchgroup=Delimiter start="\\("			matchgroup=Delimiter end="\\)\|%stopzone\>"	keepend contains=@texMathZoneGroup
447   syn region texMathZoneW	matchgroup=Delimiter start="\\\["			matchgroup=Delimiter end="\\]\|%stopzone\>"	keepend contains=@texMathZoneGroup
448   syn region texMathZoneX	matchgroup=Delimiter start="\$" skip="\\\\\|\\\$"	matchgroup=Delimiter end="\$" end="%stopzone\>"	contains=@texMathZoneGroup
449   syn region texMathZoneY	matchgroup=Delimiter start="\$\$" 			matchgroup=Delimiter end="\$\$" end="%stopzone\>"	keepend		contains=@texMathZoneGroup
450  endif
451  syn region texMathZoneZ	matchgroup=texStatement start="\\ensuremath\s*{"	matchgroup=texStatement end="}" end="%stopzone\>"	contains=@texMathZoneGroup
452 endif
453
454 syn match texMathOper		"[_^=]" contained
455
456 " Text Inside Math Zones: {{{2
457 if s:tex_fast =~ 'M'
458  if !exists("g:tex_nospell") || !g:tex_nospell
459   syn region texMathText matchgroup=texStatement start='\\\(\(inter\)\=text\|mbox\)\s*{'	end='}'	contains=@texFoldGroup,@Spell
460  else
461   syn region texMathText matchgroup=texStatement start='\\\(\(inter\)\=text\|mbox\)\s*{'	end='}'	contains=@texFoldGroup
462  endif
463 endif
464
465 " \left..something.. and \right..something.. support: {{{2
466 syn match   texMathDelimBad	contained		"\S"
467 if has("conceal") && &enc == 'utf-8' && s:tex_conceal =~ 'm'
468  syn match   texMathDelim	contained		"\\left\\{\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar={
469  syn match   texMathDelim	contained		"\\right\\}\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad contains=texMathSymbol cchar=}
470  let s:texMathDelimList=[
471     \ ['<'            , '<'] ,
472     \ ['>'            , '>'] ,
473     \ ['('            , '('] ,
474     \ [')'            , ')'] ,
475     \ ['\['           , '['] ,
476     \ [']'            , ']'] ,
477     \ ['\\{'          , '{'] ,
478     \ ['\\}'          , '}'] ,
479     \ ['|'            , '|'] ,
480     \ ['\\|'          , '‖'] ,
481     \ ['\\backslash'  , '\'] ,
482     \ ['\\downarrow'  , '↓'] ,
483     \ ['\\Downarrow'  , '⇓'] ,
484     \ ['\\langle'     , '<'] ,
485     \ ['\\lbrace'     , '['] ,
486     \ ['\\lceil'      , '⌈'] ,
487     \ ['\\lfloor'     , '⌊'] ,
488     \ ['\\lgroup'     , '⌊'] ,
489     \ ['\\lmoustache' , '⎛'] ,
490     \ ['\\rangle'     , '>'] ,
491     \ ['\\rbrace'     , ']'] ,
492     \ ['\\rceil'      , '⌉'] ,
493     \ ['\\rfloor'     , '⌋'] ,
494     \ ['\\rgroup'     , '⌋'] ,
495     \ ['\\rmoustache' , '⎞'] ,
496     \ ['\\uparrow'    , '↑'] ,
497     \ ['\\Uparrow'    , '↑'] ,
498     \ ['\\updownarrow', '↕'] ,
499     \ ['\\Updownarrow', '⇕']]
500  syn match texMathDelim	'\\[bB]igg\=[lr]' contained nextgroup=texMathDelimBad
501  for texmath in s:texMathDelimList
502   exe "syn match texMathDelim	'\\\\[bB]igg\\=[lr]\\=".texmath[0]."'	contained conceal cchar=".texmath[1]
503  endfor
504
505 else
506  syn match   texMathDelim	contained		"\\\(left\|right\)\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
507  syn match   texMathDelim	contained		"\\[bB]igg\=[lr]\=\>"	skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
508  syn match   texMathDelimSet2	contained	"\\"		nextgroup=texMathDelimKey,texMathDelimBad
509  syn match   texMathDelimSet1	contained	"[<>()[\]|/.]\|\\[{}|]"
510  syn keyword texMathDelimKey	contained	backslash       lceil           lVert           rgroup          uparrow
511  syn keyword texMathDelimKey	contained	downarrow       lfloor          rangle          rmoustache      Uparrow
512  syn keyword texMathDelimKey	contained	Downarrow       lgroup          rbrace          rvert           updownarrow
513  syn keyword texMathDelimKey	contained	langle          lmoustache      rceil           rVert           Updownarrow
514  syn keyword texMathDelimKey	contained	lbrace          lvert           rfloor
515 endif
516 syn match   texMathDelim	contained		"\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
517 syn match   texMathDelim	contained		"\\lefteqn\>"
518endif
519
520" Special TeX characters  ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
521syn match texSpecialChar	"\\[$&%#{}_]"
522if b:tex_stylish
523  syn match texSpecialChar	"\\[SP@][^a-zA-Z@]"me=e-1
524else
525  syn match texSpecialChar	"\\[SP@]\A"me=e-1
526endif
527syn match texSpecialChar	"\\\\"
528if !exists("tex_no_math")
529 syn match texOnlyMath		"[_^]"
530endif
531syn match texSpecialChar	"\^\^[0-9a-f]\{2}\|\^\^\S"
532
533" Comments: {{{1
534"    Normal TeX LaTeX     :   %....
535"    Documented TeX Format:  ^^A...	-and-	leading %s (only)
536if !exists("g:tex_comment_nospell") || !g:tex_comment_nospell
537 syn cluster texCommentGroup	contains=texTodo,@Spell
538else
539 syn cluster texCommentGroup	contains=texTodo,@NoSpell
540endif
541syn case ignore
542syn keyword texTodo		contained		combak	fixme	todo	xxx
543syn case match
544if s:extfname == "dtx"
545  syn match texComment		"\^\^A.*$"	contains=@texCommentGroup
546  syn match texComment		"^%\+"		contains=@texCommentGroup
547else
548  if g:tex_fold_enabled
549   " allows syntax-folding of 2 or more contiguous comment lines
550   " single-line comments are not folded
551   syn match  texComment	"%.*$"			contains=@texCommentGroup
552   if s:tex_fast =~ 'c'
553    syn region texComment	start="^\zs\s*%.*\_s*%"	skip="^\s*%"	end='^\ze\s*[^%]' fold
554    syn region texNoSpell	contained fold		matchgroup=texComment start="%\s*nospell\s*{"	end="%\s*nospell\s*}"	contains=@texFoldGroup,@NoSpell
555   endif
556  else
557   syn match texComment		"%.*$"			contains=@texCommentGroup
558   if s:tex_fast =~ 'c'
559    syn region texNoSpell	contained		matchgroup=texComment start="%\s*nospell\s*{"	end="%\s*nospell\s*}"	contains=@texFoldGroup,@NoSpell
560   endif
561  endif
562endif
563
564" Separate lines used for verb` and verb# so that the end conditions {{{1
565" will appropriately terminate.
566" If g:tex_verbspell exists, then verbatim texZones will permit spellchecking there.
567if s:tex_fast =~ 'v'
568  if exists("g:tex_verbspell") && g:tex_verbspell
569   syn region texZone		start="\\begin{[vV]erbatim}"		end="\\end{[vV]erbatim}\|%stopzone\>"	contains=@Spell
570   " listings package:
571   syn region texZone		start="\\begin{lstlisting}"		end="\\end{lstlisting}\|%stopzone\>"	contains=@Spell
572   if version < 600
573    syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"			contains=@Spell
574    syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"			contains=@Spell
575   else
576     if b:tex_stylish
577      syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z@]\)"	end="\z1\|%stopzone\>"			contains=@Spell
578     else
579      syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z]\)"	end="\z1\|%stopzone\>"			contains=@Spell
580     endif
581   endif
582  else
583   syn region texZone		start="\\begin{[vV]erbatim}"		end="\\end{[vV]erbatim}\|%stopzone\>"
584   if version < 600
585    syn region texZone		start="\\verb\*\=`"			end="`\|%stopzone\>"
586    syn region texZone		start="\\verb\*\=#"			end="#\|%stopzone\>"
587   else
588     if b:tex_stylish
589       syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z@]\)"	end="\z1\|%stopzone\>"
590     else
591       syn region texZone		start="\\verb\*\=\z([^\ta-zA-Z]\)"	end="\z1\|%stopzone\>"
592     endif
593   endif
594  endif
595endif
596
597" Tex Reference Zones: {{{1
598if s:tex_fast =~ 'r'
599  syn region texZone		matchgroup=texStatement start="@samp{"			end="}\|%stopzone\>"	contains=@texRefGroup
600  syn region texRefZone		matchgroup=texStatement start="\\nocite{"		end="}\|%stopzone\>"	contains=@texRefGroup
601  syn region texRefZone		matchgroup=texStatement start="\\bibliography{"		end="}\|%stopzone\>"	contains=@texRefGroup
602  syn region texRefZone		matchgroup=texStatement start="\\label{"		end="}\|%stopzone\>"	contains=@texRefGroup
603  syn region texRefZone		matchgroup=texStatement start="\\\(page\|eq\)ref{"	end="}\|%stopzone\>"	contains=@texRefGroup
604  syn region texRefZone		matchgroup=texStatement start="\\v\=ref{"		end="}\|%stopzone\>"	contains=@texRefGroup
605  syn region texRefOption	contained	matchgroup=Delimiter start='\[' end=']'		contains=@texRefGroup,texRefZone	nextgroup=texRefOption,texCite
606  syn region texCite	contained	matchgroup=Delimiter start='{' end='}'		contains=@texRefGroup,texRefZone,texCite
607endif
608syn match  texRefZone		'\\cite\%([tp]\*\=\)\=' nextgroup=texRefOption,texCite
609
610" Handle newcommand, newenvironment : {{{1
611syn match  texNewCmd				"\\newcommand\>"			nextgroup=texCmdName skipwhite skipnl
612if s:tex_fast =~ 'V'
613  syn region texCmdName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
614  syn region texCmdArgs contained matchgroup=Delimiter start="\["rs=s+1 end="]"		nextgroup=texCmdBody skipwhite skipnl
615  syn region texCmdBody contained matchgroup=Delimiter start="{"rs=s+1 skip="\\\\\|\\[{}]"	matchgroup=Delimiter end="}" contains=@texCmdGroup
616endif
617syn match  texNewEnv				"\\newenvironment\>"			nextgroup=texEnvName skipwhite skipnl
618if s:tex_fast =~ 'V'
619  syn region texEnvName contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvBgn skipwhite skipnl
620  syn region texEnvBgn  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
621  syn region texEnvEnd  contained matchgroup=Delimiter start="{"rs=s+1  end="}"		skipwhite skipnl contains=@texEnvGroup
622endif
623
624" Definitions/Commands: {{{1
625syn match texDefCmd				"\\def\>"				nextgroup=texDefName skipwhite skipnl
626if b:tex_stylish
627  syn match texDefName contained		"\\[a-zA-Z@]\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
628  syn match texDefName contained		"\\[^a-zA-Z@]"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
629else
630  syn match texDefName contained		"\\\a\+"				nextgroup=texDefParms,texCmdBody skipwhite skipnl
631  syn match texDefName contained		"\\\A"					nextgroup=texDefParms,texCmdBody skipwhite skipnl
632endif
633syn match texDefParms  contained		"#[^{]*"	contains=texDefParm	nextgroup=texCmdBody skipwhite skipnl
634syn match  texDefParm  contained		"#\d\+"
635
636" TeX Lengths: {{{1
637syn match  texLength		"\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
638
639" TeX String Delimiters: {{{1
640syn match texString		"\(``\|''\|,,\)"
641
642" makeatletter -- makeatother sections
643if !exists("s:tex_no_error")
644 if s:tex_fast =~ 'S'
645  syn region texStyle			matchgroup=texStatement start='\\makeatletter' end='\\makeatother'	contains=@texStyleGroup contained
646 endif
647 syn match  texStyleStatement		"\\[a-zA-Z@]\+"	contained
648 if s:tex_fast =~ 'S'
649  syn region texStyleMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		contains=@texStyleGroup,texError	contained
650  syn region texStyleMatcher		matchgroup=Delimiter start="\["				end="]"		contains=@texStyleGroup,texError	contained
651 endif
652endif
653
654" Conceal mode support (supports set cole=2) {{{1
655if has("conceal") && &enc == 'utf-8'
656
657 " Math Symbols {{{2
658 " (many of these symbols were contributed by Björn Winckler)
659 if s:tex_conceal =~ 'm'
660  let s:texMathList=[
661    \ ['|'		, '‖'],
662    \ ['aleph'		, 'ℵ'],
663    \ ['amalg'		, '∐'],
664    \ ['angle'		, '∠'],
665    \ ['approx'		, '≈'],
666    \ ['ast'		, '∗'],
667    \ ['asymp'		, '≍'],
668    \ ['backepsilon'	, '∍'],
669    \ ['backsimeq'	, '≃'],
670    \ ['backslash'	, '∖'],
671    \ ['barwedge'	, '⊼'],
672    \ ['because'	, '∵'],
673    \ ['between'	, '≬'],
674    \ ['bigcap'		, '∩'],
675    \ ['bigcirc'	, '○'],
676    \ ['bigcup'		, '∪'],
677    \ ['bigodot'	, '⊙'],
678    \ ['bigoplus'	, '⊕'],
679    \ ['bigotimes'	, '⊗'],
680    \ ['bigsqcup'	, '⊔'],
681    \ ['bigtriangledown', '∇'],
682    \ ['bigtriangleup'	, '∆'],
683    \ ['bigvee'		, '⋁'],
684    \ ['bigwedge'	, '⋀'],
685    \ ['blacksquare'	, '∎'],
686    \ ['bot'		, '⊥'],
687    \ ['bowtie'	        , '⋈'],
688    \ ['boxdot'		, '⊡'],
689    \ ['boxminus'	, '⊟'],
690    \ ['boxplus'	, '⊞'],
691    \ ['boxtimes'	, '⊠'],
692    \ ['bullet'	        , '•'],
693    \ ['bumpeq'		, '≏'],
694    \ ['Bumpeq'		, '≎'],
695    \ ['cap'		, '∩'],
696    \ ['Cap'		, '⋒'],
697    \ ['cdot'		, '·'],
698    \ ['cdots'		, '⋯'],
699    \ ['circ'		, '∘'],
700    \ ['circeq'		, '≗'],
701    \ ['circlearrowleft', '↺'],
702    \ ['circlearrowright', '↻'],
703    \ ['circledast'	, '⊛'],
704    \ ['circledcirc'	, '⊚'],
705    \ ['clubsuit'	, '♣'],
706    \ ['complement'	, '∁'],
707    \ ['cong'		, '≅'],
708    \ ['coprod'		, '∐'],
709    \ ['copyright'	, '©'],
710    \ ['cup'		, '∪'],
711    \ ['Cup'		, '⋓'],
712    \ ['curlyeqprec'	, '⋞'],
713    \ ['curlyeqsucc'	, '⋟'],
714    \ ['curlyvee'	, '⋎'],
715    \ ['curlywedge'	, '⋏'],
716    \ ['dagger'	        , '†'],
717    \ ['dashv'		, '⊣'],
718    \ ['ddagger'	, '‡'],
719    \ ['ddots'	        , '⋱'],
720    \ ['diamond'	, '⋄'],
721    \ ['diamondsuit'	, '♢'],
722    \ ['div'		, '÷'],
723    \ ['doteq'		, '≐'],
724    \ ['doteqdot'	, '≑'],
725    \ ['dotplus'	, '∔'],
726    \ ['dots'		, '…'],
727    \ ['dotsb'		, '⋯'],
728    \ ['dotsc'		, '…'],
729    \ ['dotsi'		, '⋯'],
730    \ ['dotso'		, '…'],
731    \ ['doublebarwedge'	, '⩞'],
732    \ ['downarrow'	, '↓'],
733    \ ['Downarrow'	, '⇓'],
734    \ ['ell'		, 'ℓ'],
735    \ ['emptyset'	, '∅'],
736    \ ['eqcirc'		, '≖'],
737    \ ['eqsim'		, '≂'],
738    \ ['eqslantgtr'	, '⪖'],
739    \ ['eqslantless'	, '⪕'],
740    \ ['equiv'		, '≡'],
741    \ ['exists'		, '∃'],
742    \ ['fallingdotseq'	, '≒'],
743    \ ['flat'		, '♭'],
744    \ ['forall'		, '∀'],
745    \ ['frown'		, '⁔'],
746    \ ['ge'		, '≥'],
747    \ ['geq'		, '≥'],
748    \ ['geqq'		, '≧'],
749    \ ['gets'		, '←'],
750    \ ['gg'		, '⟫'],
751    \ ['gneqq'		, '≩'],
752    \ ['gtrdot'		, '⋗'],
753    \ ['gtreqless'	, '⋛'],
754    \ ['gtrless'	, '≷'],
755    \ ['gtrsim'		, '≳'],
756    \ ['hbar'		, 'ℏ'],
757    \ ['heartsuit'	, '♡'],
758    \ ['hookleftarrow'	, '↩'],
759    \ ['hookrightarrow'	, '↪'],
760    \ ['iiint'		, '∭'],
761    \ ['iint'		, '∬'],
762    \ ['Im'		, 'ℑ'],
763    \ ['imath'		, 'ɩ'],
764    \ ['in'		, '∈'],
765    \ ['infty'		, '∞'],
766    \ ['int'		, '∫'],
767    \ ['lceil'		, '⌈'],
768    \ ['ldots'		, '…'],
769    \ ['le'		, '≤'],
770    \ ['leadsto'	, '↝'],
771    \ ['left('		, '('],
772    \ ['left\['		, '['],
773    \ ['left\\{'	, '{'],
774    \ ['leftarrow'	, '⟵'],
775    \ ['Leftarrow'	, '⟸'],
776    \ ['leftarrowtail'	, '↢'],
777    \ ['leftharpoondown', '↽'],
778    \ ['leftharpoonup'	, '↼'],
779    \ ['leftrightarrow'	, '↔'],
780    \ ['Leftrightarrow'	, '⇔'],
781    \ ['leftrightsquigarrow', '↭'],
782    \ ['leftthreetimes'	, '⋋'],
783    \ ['leq'		, '≤'],
784    \ ['leq'		, '≤'],
785    \ ['leqq'		, '≦'],
786    \ ['lessdot'	, '⋖'],
787    \ ['lesseqgtr'	, '⋚'],
788    \ ['lesssim'	, '≲'],
789    \ ['lfloor'		, '⌊'],
790    \ ['ll'		, '≪'],
791    \ ['lmoustache'     , '╭'],
792    \ ['lneqq'		, '≨'],
793    \ ['ltimes'		, '⋉'],
794    \ ['mapsto'		, '↦'],
795    \ ['measuredangle'	, '∡'],
796    \ ['mid'		, '∣'],
797    \ ['models'		, '╞'],
798    \ ['mp'		, '∓'],
799    \ ['nabla'		, '∇'],
800    \ ['natural'	, '♮'],
801    \ ['ncong'		, '≇'],
802    \ ['ne'		, '≠'],
803    \ ['nearrow'	, '↗'],
804    \ ['neg'		, '¬'],
805    \ ['neq'		, '≠'],
806    \ ['nexists'	, '∄'],
807    \ ['ngeq'		, '≱'],
808    \ ['ngeqq'		, '≱'],
809    \ ['ngtr'		, '≯'],
810    \ ['ni'		, '∋'],
811    \ ['nleftarrow'	, '↚'],
812    \ ['nLeftarrow'	, '⇍'],
813    \ ['nLeftrightarrow', '⇎'],
814    \ ['nleq'		, '≰'],
815    \ ['nleqq'		, '≰'],
816    \ ['nless'		, '≮'],
817    \ ['nmid'		, '∤'],
818    \ ['notin'		, '∉'],
819    \ ['nprec'		, '⊀'],
820    \ ['nrightarrow'	, '↛'],
821    \ ['nRightarrow'	, '⇏'],
822    \ ['nsim'		, '≁'],
823    \ ['nsucc'		, '⊁'],
824    \ ['ntriangleleft'	, '⋪'],
825    \ ['ntrianglelefteq', '⋬'],
826    \ ['ntriangleright'	, '⋫'],
827    \ ['ntrianglerighteq', '⋭'],
828    \ ['nvdash'		, '⊬'],
829    \ ['nvDash'		, '⊭'],
830    \ ['nVdash'		, '⊮'],
831    \ ['nwarrow'	, '↖'],
832    \ ['odot'		, '⊙'],
833    \ ['oint'		, '∮'],
834    \ ['ominus'		, '⊖'],
835    \ ['oplus'		, '⊕'],
836    \ ['oslash'		, '⊘'],
837    \ ['otimes'		, '⊗'],
838    \ ['owns'		, '∋'],
839    \ ['P'	        , '¶'],
840    \ ['parallel'	, '║'],
841    \ ['partial'	, '∂'],
842    \ ['perp'		, '⊥'],
843    \ ['pitchfork'	, '⋔'],
844    \ ['pm'		, '±'],
845    \ ['prec'		, '≺'],
846    \ ['precapprox'	, '⪷'],
847    \ ['preccurlyeq'	, '≼'],
848    \ ['preceq'		, '⪯'],
849    \ ['precnapprox'	, '⪹'],
850    \ ['precneqq'	, '⪵'],
851    \ ['precsim'	, '≾'],
852    \ ['prime'		, '′'],
853    \ ['prod'		, '∏'],
854    \ ['propto'		, '∝'],
855    \ ['rceil'		, '⌉'],
856    \ ['Re'		, 'ℜ'],
857    \ ['rfloor'		, '⌋'],
858    \ ['right)'		, ')'],
859    \ ['right]'		, ']'],
860    \ ['right\\}'	, '}'],
861    \ ['rightarrow'	, '⟶'],
862    \ ['Rightarrow'	, '⟹'],
863    \ ['rightarrowtail'	, '↣'],
864    \ ['rightleftharpoons', '⇌'],
865    \ ['rightsquigarrow', '↝'],
866    \ ['rightthreetimes', '⋌'],
867    \ ['risingdotseq'	, '≓'],
868    \ ['rmoustache'     , '╮'],
869    \ ['rtimes'		, '⋊'],
870    \ ['S'	        , '§'],
871    \ ['searrow'	, '↘'],
872    \ ['setminus'	, '∖'],
873    \ ['sharp'		, '♯'],
874    \ ['sim'		, '∼'],
875    \ ['simeq'		, '⋍'],
876    \ ['smile'		, '‿'],
877    \ ['spadesuit'	, '♠'],
878    \ ['sphericalangle'	, '∢'],
879    \ ['sqcap'		, '⊓'],
880    \ ['sqcup'		, '⊔'],
881    \ ['sqsubset'	, '⊏'],
882    \ ['sqsubseteq'	, '⊑'],
883    \ ['sqsupset'	, '⊐'],
884    \ ['sqsupseteq'	, '⊒'],
885    \ ['star'		, '✫'],
886    \ ['subset'		, '⊂'],
887    \ ['Subset'		, '⋐'],
888    \ ['subseteq'	, '⊆'],
889    \ ['subseteqq'	, '⫅'],
890    \ ['subsetneq'	, '⊊'],
891    \ ['subsetneqq'	, '⫋'],
892    \ ['succ'		, '≻'],
893    \ ['succapprox'	, '⪸'],
894    \ ['succcurlyeq'	, '≽'],
895    \ ['succeq'		, '⪰'],
896    \ ['succnapprox'	, '⪺'],
897    \ ['succneqq'	, '⪶'],
898    \ ['succsim'	, '≿'],
899    \ ['sum'		, '∑'],
900    \ ['supset'		, '⊃'],
901    \ ['Supset'		, '⋑'],
902    \ ['supseteq'	, '⊇'],
903    \ ['supseteqq'	, '⫆'],
904    \ ['supsetneq'	, '⊋'],
905    \ ['supsetneqq'	, '⫌'],
906    \ ['surd'		, '√'],
907    \ ['swarrow'	, '↙'],
908    \ ['therefore'	, '∴'],
909    \ ['times'		, '×'],
910    \ ['to'		, '→'],
911    \ ['top'		, '⊤'],
912    \ ['triangle'	, '∆'],
913    \ ['triangleleft'	, '⊲'],
914    \ ['trianglelefteq'	, '⊴'],
915    \ ['triangleq'	, '≜'],
916    \ ['triangleright'	, '⊳'],
917    \ ['trianglerighteq', '⊵'],
918    \ ['twoheadleftarrow', '↞'],
919    \ ['twoheadrightarrow', '↠'],
920    \ ['uparrow'	, '↑'],
921    \ ['Uparrow'	, '⇑'],
922    \ ['updownarrow'	, '↕'],
923    \ ['Updownarrow'	, '⇕'],
924    \ ['varnothing'	, '∅'],
925    \ ['vartriangle'	, '∆'],
926    \ ['vdash'		, '⊢'],
927    \ ['vDash'		, '⊨'],
928    \ ['Vdash'		, '⊩'],
929    \ ['vdots'		, '⋮'],
930    \ ['vee'		, '∨'],
931    \ ['veebar'		, '⊻'],
932    \ ['Vvdash'		, '⊪'],
933    \ ['wedge'		, '∧'],
934    \ ['wp'		, '℘'],
935    \ ['wr'		, '≀']]
936"    \ ['jmath'		, 'X']
937"    \ ['uminus'	, 'X']
938"    \ ['uplus'		, 'X']
939  for texmath in s:texMathList
940   if texmath[0] =~ '\w$'
941    exe "syn match texMathSymbol '\\\\".texmath[0]."\\>' contained conceal cchar=".texmath[1]
942   else
943    exe "syn match texMathSymbol '\\\\".texmath[0]."' contained conceal cchar=".texmath[1]
944   endif
945  endfor
946
947  if &ambw == "double"
948   syn match texMathSymbol '\\gg\>'			contained conceal cchar=≫
949   syn match texMathSymbol '\\ll\>'			contained conceal cchar=≪
950  else
951   syn match texMathSymbol '\\gg\>'			contained conceal cchar=⟫
952   syn match texMathSymbol '\\ll\>'			contained conceal cchar=⟪
953  endif
954
955  syn match texMathSymbol '\\hat{a}' contained conceal cchar=â
956  syn match texMathSymbol '\\hat{A}' contained conceal cchar=Â
957  syn match texMathSymbol '\\hat{c}' contained conceal cchar=ĉ
958  syn match texMathSymbol '\\hat{C}' contained conceal cchar=Ĉ
959  syn match texMathSymbol '\\hat{e}' contained conceal cchar=ê
960  syn match texMathSymbol '\\hat{E}' contained conceal cchar=Ê
961  syn match texMathSymbol '\\hat{g}' contained conceal cchar=ĝ
962  syn match texMathSymbol '\\hat{G}' contained conceal cchar=Ĝ
963  syn match texMathSymbol '\\hat{i}' contained conceal cchar=î
964  syn match texMathSymbol '\\hat{I}' contained conceal cchar=Î
965  syn match texMathSymbol '\\hat{o}' contained conceal cchar=ô
966  syn match texMathSymbol '\\hat{O}' contained conceal cchar=Ô
967  syn match texMathSymbol '\\hat{s}' contained conceal cchar=ŝ
968  syn match texMathSymbol '\\hat{S}' contained conceal cchar=Ŝ
969  syn match texMathSymbol '\\hat{u}' contained conceal cchar=û
970  syn match texMathSymbol '\\hat{U}' contained conceal cchar=Û
971  syn match texMathSymbol '\\hat{w}' contained conceal cchar=ŵ
972  syn match texMathSymbol '\\hat{W}' contained conceal cchar=Ŵ
973  syn match texMathSymbol '\\hat{y}' contained conceal cchar=ŷ
974  syn match texMathSymbol '\\hat{Y}' contained conceal cchar=Ŷ
975 endif
976
977 " Greek {{{2
978 if s:tex_conceal =~ 'g'
979  fun! s:Greek(group,pat,cchar)
980    exe 'syn match '.a:group." '".a:pat."' contained conceal cchar=".a:cchar
981  endfun
982  call s:Greek('texGreek','\\alpha\>'		,'α')
983  call s:Greek('texGreek','\\beta\>'		,'β')
984  call s:Greek('texGreek','\\gamma\>'		,'γ')
985  call s:Greek('texGreek','\\delta\>'		,'δ')
986  call s:Greek('texGreek','\\epsilon\>'		,'ϵ')
987  call s:Greek('texGreek','\\varepsilon\>'	,'ε')
988  call s:Greek('texGreek','\\zeta\>'		,'ζ')
989  call s:Greek('texGreek','\\eta\>'		,'η')
990  call s:Greek('texGreek','\\theta\>'		,'θ')
991  call s:Greek('texGreek','\\vartheta\>'		,'ϑ')
992  call s:Greek('texGreek','\\kappa\>'		,'κ')
993  call s:Greek('texGreek','\\lambda\>'		,'λ')
994  call s:Greek('texGreek','\\mu\>'		,'μ')
995  call s:Greek('texGreek','\\nu\>'		,'ν')
996  call s:Greek('texGreek','\\xi\>'		,'ξ')
997  call s:Greek('texGreek','\\pi\>'		,'π')
998  call s:Greek('texGreek','\\varpi\>'		,'ϖ')
999  call s:Greek('texGreek','\\rho\>'		,'ρ')
1000  call s:Greek('texGreek','\\varrho\>'		,'ϱ')
1001  call s:Greek('texGreek','\\sigma\>'		,'σ')
1002  call s:Greek('texGreek','\\varsigma\>'		,'ς')
1003  call s:Greek('texGreek','\\tau\>'		,'τ')
1004  call s:Greek('texGreek','\\upsilon\>'		,'υ')
1005  call s:Greek('texGreek','\\phi\>'		,'φ')
1006  call s:Greek('texGreek','\\varphi\>'		,'ϕ')
1007  call s:Greek('texGreek','\\chi\>'		,'χ')
1008  call s:Greek('texGreek','\\psi\>'		,'ψ')
1009  call s:Greek('texGreek','\\omega\>'		,'ω')
1010  call s:Greek('texGreek','\\Gamma\>'		,'Γ')
1011  call s:Greek('texGreek','\\Delta\>'		,'Δ')
1012  call s:Greek('texGreek','\\Theta\>'		,'Θ')
1013  call s:Greek('texGreek','\\Lambda\>'		,'Λ')
1014  call s:Greek('texGreek','\\Xi\>'		,'Χ')
1015  call s:Greek('texGreek','\\Pi\>'		,'Π')
1016  call s:Greek('texGreek','\\Sigma\>'		,'Σ')
1017  call s:Greek('texGreek','\\Upsilon\>'		,'Υ')
1018  call s:Greek('texGreek','\\Phi\>'		,'Φ')
1019  call s:Greek('texGreek','\\Psi\>'		,'Ψ')
1020  call s:Greek('texGreek','\\Omega\>'		,'Ω')
1021  delfun s:Greek
1022 endif
1023
1024 " Superscripts/Subscripts {{{2
1025 if s:tex_conceal =~ 's'
1026  if s:tex_fast =~ 's'
1027   syn region texSuperscript	matchgroup=Delimiter start='\^{'	skip="\\\\\|\\[{}]" end='}'	contained concealends contains=texSpecialChar,texSuperscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
1028   syn region texSubscript	matchgroup=Delimiter start='_{'		skip="\\\\\|\\[{}]" end='}'	contained concealends contains=texSpecialChar,texSubscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
1029  endif
1030  fun! s:SuperSub(group,leader,pat,cchar)
1031    exe 'syn match '.a:group." '".a:leader.a:pat."' contained conceal cchar=".a:cchar
1032    exe 'syn match '.a:group."s '".a:pat."' contained conceal cchar=".a:cchar.' nextgroup='.a:group.'s'
1033  endfun
1034  call s:SuperSub('texSuperscript','\^','0','⁰')
1035  call s:SuperSub('texSuperscript','\^','1','¹')
1036  call s:SuperSub('texSuperscript','\^','2','²')
1037  call s:SuperSub('texSuperscript','\^','3','³')
1038  call s:SuperSub('texSuperscript','\^','4','⁴')
1039  call s:SuperSub('texSuperscript','\^','5','⁵')
1040  call s:SuperSub('texSuperscript','\^','6','⁶')
1041  call s:SuperSub('texSuperscript','\^','7','⁷')
1042  call s:SuperSub('texSuperscript','\^','8','⁸')
1043  call s:SuperSub('texSuperscript','\^','9','⁹')
1044  call s:SuperSub('texSuperscript','\^','a','ᵃ')
1045  call s:SuperSub('texSuperscript','\^','b','ᵇ')
1046  call s:SuperSub('texSuperscript','\^','c','ᶜ')
1047  call s:SuperSub('texSuperscript','\^','d','ᵈ')
1048  call s:SuperSub('texSuperscript','\^','e','ᵉ')
1049  call s:SuperSub('texSuperscript','\^','f','ᶠ')
1050  call s:SuperSub('texSuperscript','\^','g','ᵍ')
1051  call s:SuperSub('texSuperscript','\^','h','ʰ')
1052  call s:SuperSub('texSuperscript','\^','i','ⁱ')
1053  call s:SuperSub('texSuperscript','\^','j','ʲ')
1054  call s:SuperSub('texSuperscript','\^','k','ᵏ')
1055  call s:SuperSub('texSuperscript','\^','l','ˡ')
1056  call s:SuperSub('texSuperscript','\^','m','ᵐ')
1057  call s:SuperSub('texSuperscript','\^','n','ⁿ')
1058  call s:SuperSub('texSuperscript','\^','o','ᵒ')
1059  call s:SuperSub('texSuperscript','\^','p','ᵖ')
1060  call s:SuperSub('texSuperscript','\^','r','ʳ')
1061  call s:SuperSub('texSuperscript','\^','s','ˢ')
1062  call s:SuperSub('texSuperscript','\^','t','ᵗ')
1063  call s:SuperSub('texSuperscript','\^','u','ᵘ')
1064  call s:SuperSub('texSuperscript','\^','v','ᵛ')
1065  call s:SuperSub('texSuperscript','\^','w','ʷ')
1066  call s:SuperSub('texSuperscript','\^','x','ˣ')
1067  call s:SuperSub('texSuperscript','\^','y','ʸ')
1068  call s:SuperSub('texSuperscript','\^','z','ᶻ')
1069  call s:SuperSub('texSuperscript','\^','A','ᴬ')
1070  call s:SuperSub('texSuperscript','\^','B','ᴮ')
1071  call s:SuperSub('texSuperscript','\^','D','ᴰ')
1072  call s:SuperSub('texSuperscript','\^','E','ᴱ')
1073  call s:SuperSub('texSuperscript','\^','G','ᴳ')
1074  call s:SuperSub('texSuperscript','\^','H','ᴴ')
1075  call s:SuperSub('texSuperscript','\^','I','ᴵ')
1076  call s:SuperSub('texSuperscript','\^','J','ᴶ')
1077  call s:SuperSub('texSuperscript','\^','K','ᴷ')
1078  call s:SuperSub('texSuperscript','\^','L','ᴸ')
1079  call s:SuperSub('texSuperscript','\^','M','ᴹ')
1080  call s:SuperSub('texSuperscript','\^','N','ᴺ')
1081  call s:SuperSub('texSuperscript','\^','O','ᴼ')
1082  call s:SuperSub('texSuperscript','\^','P','ᴾ')
1083  call s:SuperSub('texSuperscript','\^','R','ᴿ')
1084  call s:SuperSub('texSuperscript','\^','T','ᵀ')
1085  call s:SuperSub('texSuperscript','\^','U','ᵁ')
1086  call s:SuperSub('texSuperscript','\^','W','ᵂ')
1087  call s:SuperSub('texSuperscript','\^',',','︐')
1088  call s:SuperSub('texSuperscript','\^',':','︓')
1089  call s:SuperSub('texSuperscript','\^',';','︔')
1090  call s:SuperSub('texSuperscript','\^','+','⁺')
1091  call s:SuperSub('texSuperscript','\^','-','⁻')
1092  call s:SuperSub('texSuperscript','\^','<','˂')
1093  call s:SuperSub('texSuperscript','\^','>','˃')
1094  call s:SuperSub('texSuperscript','\^','/','ˊ')
1095  call s:SuperSub('texSuperscript','\^','(','⁽')
1096  call s:SuperSub('texSuperscript','\^',')','⁾')
1097  call s:SuperSub('texSuperscript','\^','\.','˙')
1098  call s:SuperSub('texSuperscript','\^','=','˭')
1099  call s:SuperSub('texSubscript','_','0','₀')
1100  call s:SuperSub('texSubscript','_','1','₁')
1101  call s:SuperSub('texSubscript','_','2','₂')
1102  call s:SuperSub('texSubscript','_','3','₃')
1103  call s:SuperSub('texSubscript','_','4','₄')
1104  call s:SuperSub('texSubscript','_','5','₅')
1105  call s:SuperSub('texSubscript','_','6','₆')
1106  call s:SuperSub('texSubscript','_','7','₇')
1107  call s:SuperSub('texSubscript','_','8','₈')
1108  call s:SuperSub('texSubscript','_','9','₉')
1109  call s:SuperSub('texSubscript','_','a','ₐ')
1110  call s:SuperSub('texSubscript','_','e','ₑ')
1111  call s:SuperSub('texSubscript','_','i','ᵢ')
1112  call s:SuperSub('texSubscript','_','o','ₒ')
1113  call s:SuperSub('texSubscript','_','u','ᵤ')
1114  call s:SuperSub('texSubscript','_',',','︐')
1115  call s:SuperSub('texSubscript','_','+','₊')
1116  call s:SuperSub('texSubscript','_','-','₋')
1117  call s:SuperSub('texSubscript','_','/','ˏ')
1118  call s:SuperSub('texSubscript','_','(','₍')
1119  call s:SuperSub('texSubscript','_',')','₎')
1120  call s:SuperSub('texSubscript','_','\.','‸')
1121  call s:SuperSub('texSubscript','_','r','ᵣ')
1122  call s:SuperSub('texSubscript','_','v','ᵥ')
1123  call s:SuperSub('texSubscript','_','x','ₓ')
1124  call s:SuperSub('texSubscript','_','\\beta\>' ,'ᵦ')
1125  call s:SuperSub('texSubscript','_','\\delta\>','ᵨ')
1126  call s:SuperSub('texSubscript','_','\\phi\>'  ,'ᵩ')
1127  call s:SuperSub('texSubscript','_','\\gamma\>','ᵧ')
1128  call s:SuperSub('texSubscript','_','\\chi\>'  ,'ᵪ')
1129  delfun s:SuperSub
1130 endif
1131
1132 " Accented characters: {{{2
1133 if s:tex_conceal =~ 'a'
1134  if b:tex_stylish
1135   syn match texAccent		"\\[bcdvuH][^a-zA-Z@]"me=e-1
1136   syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
1137  else
1138   fun! s:Accents(chr,...)
1139     let i= 1
1140     for accent in ["`","\\'","^",'"','\~','\.',"c","H","k","r","u","v"]
1141      if i > a:0
1142       break
1143      endif
1144      if strlen(a:{i}) == 0 || a:{i} == ' ' || a:{i} == '?'
1145       let i= i + 1
1146       continue
1147      endif
1148      if accent =~ '\a'
1149       exe "syn match texAccent '".'\\'.accent.'\(\s*{'.a:chr.'}\|\s\+'.a:chr.'\)'."' conceal cchar=".a:{i}
1150      else
1151       exe "syn match texAccent '".'\\'.accent.'\s*\({'.a:chr.'}\|'.a:chr.'\)'."' conceal cchar=".a:{i}
1152      endif
1153      let i= i + 1
1154     endfor
1155   endfun
1156   "                  \`  \'  \^  \"  \~  \.  \c  \H  \k  \r  \u  \v
1157   call s:Accents('a','à','á','â','ä','ã','ȧ',' ',' ','ą','å','ă','ă')
1158   call s:Accents('A','À','Á','Â','Ä','Ã','Ȧ',' ',' ','Ą','Å','Ă','Ă')
1159   call s:Accents('c',' ','ć','ĉ',' ',' ','ċ','ç',' ',' ',' ',' ','č')
1160   call s:Accents('C',' ','Ć','Ĉ',' ',' ','Ċ','Ç',' ',' ',' ',' ','Č')
1161   call s:Accents('d',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ď')
1162   call s:Accents('D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ď')
1163   call s:Accents('e','è','é','ê','ë','ẽ','ė','ȩ',' ','ę',' ','ĕ','ě')
1164   call s:Accents('E','È','É','Ê','Ë','Ẽ','Ė','Ȩ',' ','Ę',' ','Ĕ','Ě')
1165   call s:Accents('g',' ','ǵ','ĝ',' ',' ','ġ','ģ',' ',' ',' ','ğ',' ')
1166   call s:Accents('G',' ','Ǵ','Ĝ',' ',' ','Ġ','Ģ',' ',' ',' ','Ğ',' ')
1167   call s:Accents('h',' ',' ','ĥ',' ',' ',' ',' ',' ',' ',' ',' ','ȟ')
1168   call s:Accents('H',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ȟ')
1169   call s:Accents('i','ì','í','î','ï','ĩ','į',' ',' ',' ',' ','ĭ',' ')
1170   call s:Accents('I','Ì','Í','Î','Ï','Ĩ','İ',' ',' ',' ',' ','Ĭ',' ')
1171   call s:Accents('J',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ǰ')
1172   call s:Accents('k',' ',' ',' ',' ',' ',' ','ķ',' ',' ',' ',' ',' ')
1173   call s:Accents('K',' ',' ',' ',' ',' ',' ','Ķ',' ',' ',' ',' ',' ')
1174   call s:Accents('l',' ','ĺ','ľ',' ',' ',' ','ļ',' ',' ',' ',' ','ľ')
1175   call s:Accents('L',' ','Ĺ','Ľ',' ',' ',' ','Ļ',' ',' ',' ',' ','Ľ')
1176   call s:Accents('n',' ','ń',' ',' ','ñ',' ','ņ',' ',' ',' ',' ','ň')
1177   call s:Accents('N',' ','Ń',' ',' ','Ñ',' ','Ņ',' ',' ',' ',' ','Ň')
1178   call s:Accents('o','ò','ó','ô','ö','õ','ȯ',' ','ő','ǫ',' ','ŏ',' ')
1179   call s:Accents('O','Ò','Ó','Ô','Ö','Õ','Ȯ',' ','Ő','Ǫ',' ','Ŏ',' ')
1180   call s:Accents('r',' ','ŕ',' ',' ',' ',' ','ŗ',' ',' ',' ',' ','ř')
1181   call s:Accents('R',' ','Ŕ',' ',' ',' ',' ','Ŗ',' ',' ',' ',' ','Ř')
1182   call s:Accents('s',' ','ś','ŝ',' ',' ',' ','ş',' ','ȿ',' ',' ','š')
1183   call s:Accents('S',' ','Ś','Ŝ',' ',' ',' ','Ş',' ',' ',' ',' ','Š')
1184   call s:Accents('t',' ',' ',' ',' ',' ',' ','ţ',' ',' ',' ',' ','ť')
1185   call s:Accents('T',' ',' ',' ',' ',' ',' ','Ţ',' ',' ',' ',' ','Ť')
1186   call s:Accents('u','ù','ú','û','ü','ũ',' ',' ','ű','ų','ů','ŭ','ǔ')
1187   call s:Accents('U','Ù','Ú','Û','Ü','Ũ',' ',' ','Ű','Ų','Ů','Ŭ','Ǔ')
1188   call s:Accents('w',' ',' ','ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
1189   call s:Accents('W',' ',' ','Ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
1190   call s:Accents('y','ỳ','ý','ŷ','ÿ','ỹ',' ',' ',' ',' ',' ',' ',' ')
1191   call s:Accents('Y','Ỳ','Ý','Ŷ','Ÿ','Ỹ',' ',' ',' ',' ',' ',' ',' ')
1192   call s:Accents('z',' ','ź',' ',' ',' ','ż',' ',' ',' ',' ',' ','ž')
1193   call s:Accents('Z',' ','Ź',' ',' ',' ','Ż',' ',' ',' ',' ',' ','Ž')
1194   call s:Accents('\\i','ì','í','î','ï','ĩ','į',' ',' ',' ',' ','ĭ',' ')
1195   "                  \`  \'  \^  \"  \~  \.  \c  \H  \k  \r  \u  \v
1196   delfun s:Accents
1197   syn match texAccent   '\\aa\>'	conceal cchar=å
1198   syn match texAccent   '\\AA\>'	conceal cchar=Å
1199   syn match texAccent	'\\o\>'		conceal cchar=ø
1200   syn match texAccent	'\\O\>'		conceal cchar=Ø
1201   syn match texLigature	'\\AE\>'	conceal cchar=Æ
1202   syn match texLigature	'\\ae\>'	conceal cchar=æ
1203   syn match texLigature	'\\oe\>'	conceal cchar=œ
1204   syn match texLigature	'\\OE\>'	conceal cchar=Œ
1205   syn match texLigature	'\\ss\>'	conceal cchar=ß
1206  endif
1207 endif
1208endif
1209
1210" ---------------------------------------------------------------------
1211" LaTeX synchronization: {{{1
1212syn sync maxlines=200
1213syn sync minlines=50
1214
1215syn  sync match texSyncStop			groupthere NONE		"%stopzone\>"
1216
1217" Synchronization: {{{1
1218" The $..$ and $$..$$ make for impossible sync patterns
1219" (one can't tell if a "$$" starts or stops a math zone by itself)
1220" The following grouptheres coupled with minlines above
1221" help improve the odds of good syncing.
1222if !exists("tex_no_math")
1223 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{abstract}"
1224 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{center}"
1225 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{description}"
1226 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{enumerate}"
1227 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{itemize}"
1228 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{table}"
1229 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{tabular}"
1230 syn sync match texSyncMathZoneA		groupthere NONE		"\\\(sub\)*section\>"
1231endif
1232
1233" ---------------------------------------------------------------------
1234" Highlighting: {{{1
1235if did_tex_syntax_inits == 1
1236 let did_tex_syntax_inits= 2
1237  " TeX highlighting groups which should share similar highlighting
1238  if !exists("s:tex_no_error")
1239   if !exists("g:tex_no_math")
1240    HiLink texBadMath		texError
1241    HiLink texMathDelimBad	texError
1242    HiLink texMathError		texError
1243    if !b:tex_stylish
1244      HiLink texOnlyMath	texError
1245    endif
1246   endif
1247   HiLink texError		Error
1248  endif
1249
1250  hi texBoldStyle		gui=bold	cterm=bold
1251  hi texItalStyle		gui=italic	cterm=italic
1252  hi texBoldItalStyle		gui=bold,italic cterm=bold,italic
1253  hi texItalBoldStyle		gui=bold,italic cterm=bold,italic
1254  HiLink texCite		texRefZone
1255  HiLink texDefCmd		texDef
1256  HiLink texDefName		texDef
1257  HiLink texDocType		texCmdName
1258  HiLink texDocTypeArgs		texCmdArgs
1259  HiLink texInputFileOpt	texCmdArgs
1260  HiLink texInputCurlies	texDelimiter
1261  HiLink texLigature		texSpecialChar
1262  if !exists("tex_no_math")
1263   HiLink texMathDelimSet1	texMathDelim
1264   HiLink texMathDelimSet2	texMathDelim
1265   HiLink texMathDelimKey	texMathDelim
1266   HiLink texMathMatcher	texMath
1267   HiLink texAccent		texStatement
1268   HiLink texGreek		texStatement
1269   HiLink texSuperscript	texStatement
1270   HiLink texSubscript		texStatement
1271   HiLink texSuperscripts 	texSuperscript
1272   HiLink texSubscripts 	texSubscript
1273   HiLink texMathSymbol		texStatement
1274   HiLink texMathZoneV		texMath
1275   HiLink texMathZoneW		texMath
1276   HiLink texMathZoneX		texMath
1277   HiLink texMathZoneY		texMath
1278   HiLink texMathZoneV		texMath
1279   HiLink texMathZoneZ		texMath
1280  endif
1281  HiLink texBeginEnd		texCmdName
1282  HiLink texBeginEndName	texSection
1283  HiLink texSpaceCode		texStatement
1284  HiLink texStyleStatement	texStatement
1285  HiLink texTypeSize		texType
1286  HiLink texTypeStyle		texType
1287
1288   " Basic TeX highlighting groups
1289  HiLink texCmdArgs		Number
1290  HiLink texCmdName		Statement
1291  HiLink texComment		Comment
1292  HiLink texDef			Statement
1293  HiLink texDefParm		Special
1294  HiLink texDelimiter		Delimiter
1295  HiLink texInput		Special
1296  HiLink texInputFile		Special
1297  HiLink texLength		Number
1298  HiLink texMath		Special
1299  HiLink texMathDelim		Statement
1300  HiLink texMathOper		Operator
1301  HiLink texNewCmd		Statement
1302  HiLink texNewEnv		Statement
1303  HiLink texOption		Number
1304  HiLink texRefZone		Special
1305  HiLink texSection		PreCondit
1306  HiLink texSpaceCodeChar	Special
1307  HiLink texSpecialChar		SpecialChar
1308  HiLink texStatement		Statement
1309  HiLink texString		String
1310  HiLink texTodo		Todo
1311  HiLink texType		Type
1312  HiLink texZone		PreCondit
1313
1314  delcommand HiLink
1315endif
1316
1317" Cleanup: {{{1
1318unlet s:extfname
1319let   b:current_syntax = "tex"
1320let &cpo               = s:keepcpo
1321unlet s:keepcpo
1322" vim: ts=8 fdm=marker
1323