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