xref: /vim-8.2.3635/runtime/syntax/tex.vim (revision ea034590)
1" Vim syntax file
2" Language:	TeX
3" Maintainer:	Charles E. Campbell <[email protected]>
4" Last Change:	May 02, 2016
5" Version:	95
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
65
66" by default, enable all region-based highlighting
67let s:tex_fast= "bcmMprsSvV"
68if exists("g:tex_fast")
69 if type(g:tex_fast) != 1
70  " g:tex_fast exists and is not a string, so
71  " turn off all optional region-based highighting
72  let s:tex_fast= ""
73 else
74  let s:tex_fast= g:tex_fast
75 endif
76endif
77
78" let user determine which classes of concealment will be supported
79"   a=accents/ligatures d=delimiters m=math symbols  g=Greek  s=superscripts/subscripts
80if !exists("g:tex_conceal")
81 let s:tex_conceal= 'abdmgsS'
82else
83 let s:tex_conceal= g:tex_conceal
84endif
85if !exists("g:tex_superscripts")
86 let s:tex_superscripts= "[0-9a-zA-W.,:;+-<>/()=]"
87else
88 let s:tex_superscripts= g:tex_superscripts
89endif
90if !exists("g:tex_subscripts")
91 let s:tex_subscripts= "[0-9aehijklmnoprstuvx,+-/().]"
92else
93 let s:tex_subscripts= g:tex_subscripts
94endif
95
96" Determine whether or not to use "*.sty" mode {{{1
97" The user may override the normal determination by setting
98"   g:tex_stylish to 1      (for    "*.sty" mode)
99"    or to           0 else (normal "*.tex" mode)
100" or on a buffer-by-buffer basis with b:tex_stylish
101let s:extfname=expand("%:e")
102if exists("g:tex_stylish")
103 let b:tex_stylish= g:tex_stylish
104elseif !exists("b:tex_stylish")
105 if s:extfname == "sty" || s:extfname == "cls" || s:extfname == "clo" || s:extfname == "dtx" || s:extfname == "ltx"
106  let b:tex_stylish= 1
107 else
108  let b:tex_stylish= 0
109 endif
110endif
111
112" handle folding {{{1
113if !exists("g:tex_fold_enabled")
114 let s:tex_fold_enabled= 0
115elseif g:tex_fold_enabled && !has("folding")
116 let s:tex_fold_enabled= 0
117 echomsg "Ignoring g:tex_fold_enabled=".g:tex_fold_enabled."; need to re-compile vim for +fold support"
118else
119 let s:tex_fold_enabled= 1
120endif
121if s:tex_fold_enabled && &fdm == "manual"
122 setl fdm=syntax
123endif
124if s:tex_fold_enabled && has("folding")
125 com! -nargs=* TexFold <args> fold
126else
127 com! -nargs=* TexFold <args>
128endif
129
130" (La)TeX keywords: uses the characters 0-9,a-z,A-Z,192-255 only... {{{1
131" but _ is the only one that causes problems.
132" One may override this iskeyword setting by providing
133" g:tex_isk
134if exists("g:tex_isk")
135 exe "setlocal isk=".g:tex_isk
136elseif !has("patch-7.4.1142")
137 setl isk=48-57,a-z,A-Z,192-255
138else
139 syn iskeyword 48-57,a-z,A-Z,192-255
140endif
141if b:tex_stylish
142  setlocal isk+=@-@
143endif
144if exists("g:tex_no_error") && g:tex_no_error
145 let s:tex_no_error= 1
146else
147 let s:tex_no_error= 0
148endif
149if exists("g:tex_comment_nospell") && g:tex_comment_nospell
150 let s:tex_comment_nospell= 1
151else
152 let s:tex_comment_nospell= 0
153endif
154if exists("g:tex_nospell") && g:tex_nospell
155 let s:tex_nospell = 1
156else
157 let s:tex_nospell = 0
158endif
159
160" Clusters: {{{1
161" --------
162syn cluster texCmdGroup			contains=texCmdBody,texComment,texDefParm,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texBeginEnd,texBeginEndName,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle
163if !s:tex_no_error
164 syn cluster texCmdGroup		add=texMathError
165endif
166syn cluster texEnvGroup			contains=texMatcher,texMathDelim,texSpecialChar,texStatement
167syn 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
168syn 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
169syn 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
170if !s:tex_nospell
171 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
172 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
173else
174 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
175 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
176endif
177syn cluster texPreambleMatchGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
178syn cluster texRefGroup			contains=texMatcher,texComment,texDelimiter
179if !exists("g:tex_no_math")
180 syn cluster texPreambleMatchGroup	contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTitle,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texMathZoneZ
181 syn cluster texMathZones		contains=texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ
182 syn cluster texMatchGroup		add=@texMathZones
183 syn cluster texMathDelimGroup		contains=texMathDelimBad,texMathDelimKey,texMathDelimSet1,texMathDelimSet2
184 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
185 syn cluster texMathZoneGroup		contains=texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texMathSymbol,texMathText,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle
186 if !s:tex_no_error
187  syn cluster texMathMatchGroup		add=texMathError
188  syn cluster texMathZoneGroup		add=texMathError
189 endif
190 syn cluster texMathZoneGroup		add=@NoSpell
191 " following used in the \part \chapter \section \subsection \subsubsection
192 " \paragraph \subparagraph \author \title highlighting
193 syn cluster texDocGroup		contains=texPartZone,@texPartGroup
194 syn cluster texPartGroup		contains=texChapterZone,texSectionZone,texParaZone
195 syn cluster texChapterGroup		contains=texSectionZone,texParaZone
196 syn cluster texSectionGroup		contains=texSubSectionZone,texParaZone
197 syn cluster texSubSectionGroup		contains=texSubSubSectionZone,texParaZone
198 syn cluster texSubSubSectionGroup	contains=texParaZone
199 syn cluster texParaGroup		contains=texSubParaZone
200 if has("conceal") && &enc == 'utf-8'
201  syn cluster texMathZoneGroup		add=texGreek,texSuperscript,texSubscript,texMathSymbol
202  syn cluster texMathMatchGroup		add=texGreek,texSuperscript,texSubscript,texMathSymbol
203 endif
204endif
205
206" Try to flag {} and () mismatches: {{{1
207if s:tex_fast =~# 'm'
208  if !s:tex_no_error
209   syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		transparent contains=@texMatchGroup,texError
210   syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		transparent contains=@texMatchGroup,texError,@NoSpell
211  else
212   syn region texMatcher		matchgroup=Delimiter start="{" skip="\\\\\|\\[{}]"	end="}"		transparent contains=@texMatchGroup
213   syn region texMatcher		matchgroup=Delimiter start="\["				end="]"		transparent contains=@texMatchGroup
214  endif
215  if !s:tex_nospell
216   syn region texParen		start="("						end=")"		transparent contains=@texMatchGroup,@Spell
217  else
218   syn region texParen		start="("						end=")"		transparent contains=@texMatchGroup
219  endif
220endif
221if !s:tex_no_error
222 syn match  texError		"[}\])]"
223endif
224if s:tex_fast =~# 'M'
225  if !exists("g:tex_no_math")
226   if !s:tex_no_error
227    syn match  texMathError	"}"	contained
228   endif
229   syn region texMathMatcher	matchgroup=Delimiter	start="{"          skip="\%(\\\\\)*\\}"     end="}" end="%stopzone\>"	contained contains=@texMathMatchGroup
230  endif
231endif
232
233" TeX/LaTeX keywords: {{{1
234" Instead of trying to be All Knowing, I just match \..alphameric..
235" Note that *.tex files may not have "@" in their \commands
236if exists("g:tex_tex") || b:tex_stylish
237  syn match texStatement	"\\[a-zA-Z@]\+"
238else
239  syn match texStatement	"\\\a\+"
240  if !s:tex_no_error
241   syn match texError		"\\\a*@[a-zA-Z@]*"
242  endif
243endif
244
245" TeX/LaTeX delimiters: {{{1
246syn match texDelimiter		"&"
247syn match texDelimiter		"\\\\"
248
249" Tex/Latex Options: {{{1
250syn match texOption		"[^\\]\zs#\d\+\|^#\d\+"
251
252" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
253if b:tex_stylish
254  syn match texAccent		"\\[bcdvuH][^a-zA-Z@]"me=e-1
255  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
256else
257  syn match texAccent		"\\[bcdvuH]\A"me=e-1
258  syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
259endif
260syn match texAccent		"\\[bcdvuH]$"
261syn match texAccent		+\\[=^.\~"`']+
262syn match texAccent		+\\['=t'.c^ud"vb~Hr]{\a}+
263syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)$"
264
265" \begin{}/\end{} section markers: {{{1
266syn match  texBeginEnd		"\\begin\>\|\\end\>" nextgroup=texBeginEndName
267if s:tex_fast =~# 'm'
268  syn region texBeginEndName		matchgroup=Delimiter	start="{"		end="}"	contained	nextgroup=texBeginEndModifier	contains=texComment
269  syn region texBeginEndModifier	matchgroup=Delimiter	start="\["		end="]"	contained	contains=texComment,@NoSpell
270endif
271
272" \documentclass, \documentstyle, \usepackage: {{{1
273syn match  texDocType		"\\documentclass\>\|\\documentstyle\>\|\\usepackage\>"	nextgroup=texBeginEndName,texDocTypeArgs
274if s:tex_fast =~# 'm'
275  syn region texDocTypeArgs	matchgroup=Delimiter start="\[" end="]"			contained	nextgroup=texBeginEndName	contains=texComment,@NoSpell
276endif
277
278" Preamble syntax-based folding support: {{{1
279if s:tex_fold_enabled && has("folding")
280 syn region texPreamble	transparent fold	start='\zs\\documentclass\>' end='\ze\\begin{document}'	contains=texStyle,@texPreambleMatchGroup
281endif
282
283" TeX input: {{{1
284syn match texInput		"\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7				contains=texStatement
285syn match texInputFile		"\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}"	contains=texStatement,texInputCurlies,texInputFileOpt
286syn match texInputFile		"\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}"		contains=texStatement,texInputCurlies,texInputFileOpt
287syn match texInputCurlies	"[{}]"								contained
288if s:tex_fast =~# 'm'
289 syn region texInputFileOpt	matchgroup=Delimiter start="\[" end="\]"			contained	contains=texComment
290endif
291
292" Type Styles (LaTeX 2.09): {{{1
293syn match texTypeStyle		"\\rm\>"
294syn match texTypeStyle		"\\em\>"
295syn match texTypeStyle		"\\bf\>"
296syn match texTypeStyle		"\\it\>"
297syn match texTypeStyle		"\\sl\>"
298syn match texTypeStyle		"\\sf\>"
299syn match texTypeStyle		"\\sc\>"
300syn match texTypeStyle		"\\tt\>"
301
302" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
303if s:tex_conceal !~# 'b'
304 syn match texTypeStyle		"\\textbf\>"
305 syn match texTypeStyle		"\\textit\>"
306endif
307syn match texTypeStyle		"\\textmd\>"
308syn match texTypeStyle		"\\textrm\>"
309syn match texTypeStyle		"\\textsc\>"
310syn match texTypeStyle		"\\textsf\>"
311syn match texTypeStyle		"\\textsl\>"
312syn match texTypeStyle		"\\texttt\>"
313syn match texTypeStyle		"\\textup\>"
314syn match texTypeStyle		"\\emph\>"
315
316syn match texTypeStyle		"\\mathbb\>"
317syn match texTypeStyle		"\\mathbf\>"
318syn match texTypeStyle		"\\mathcal\>"
319syn match texTypeStyle		"\\mathfrak\>"
320syn match texTypeStyle		"\\mathit\>"
321syn match texTypeStyle		"\\mathnormal\>"
322syn match texTypeStyle		"\\mathrm\>"
323syn match texTypeStyle		"\\mathsf\>"
324syn match texTypeStyle		"\\mathtt\>"
325
326syn match texTypeStyle		"\\rmfamily\>"
327syn match texTypeStyle		"\\sffamily\>"
328syn match texTypeStyle		"\\ttfamily\>"
329
330syn match texTypeStyle		"\\itshape\>"
331syn match texTypeStyle		"\\scshape\>"
332syn match texTypeStyle		"\\slshape\>"
333syn match texTypeStyle		"\\upshape\>"
334
335syn match texTypeStyle		"\\bfseries\>"
336syn match texTypeStyle		"\\mdseries\>"
337
338" Some type sizes: {{{1
339syn match texTypeSize		"\\tiny\>"
340syn match texTypeSize		"\\scriptsize\>"
341syn match texTypeSize		"\\footnotesize\>"
342syn match texTypeSize		"\\small\>"
343syn match texTypeSize		"\\normalsize\>"
344syn match texTypeSize		"\\large\>"
345syn match texTypeSize		"\\Large\>"
346syn match texTypeSize		"\\LARGE\>"
347syn match texTypeSize		"\\huge\>"
348syn match texTypeSize		"\\Huge\>"
349
350" Spacecodes (TeX'isms): {{{1
351" \mathcode`\^^@="2201  \delcode`\(="028300  \sfcode`\)=0 \uccode`X=`X  \lccode`x=`x
352syn match texSpaceCode		"\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
353syn match texSpaceCodeChar    "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)"	contained
354
355" Sections, subsections, etc: {{{1
356if s:tex_fast =~# 'p'
357 if !s:tex_nospell
358  TexFold syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											contains=@texFoldGroup,@texDocGroup,@Spell
359  TexFold syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								contains=@texFoldGroup,@texPartGroup,@Spell
360  TexFold syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							contains=@texFoldGroup,@texChapterGroup,@Spell
361  TexFold syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					contains=@texFoldGroup,@texSectionGroup,@Spell
362  TexFold syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSectionGroup,@Spell
363  TexFold syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
364  TexFold syn region texParaZone		matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			contains=@texFoldGroup,@texParaGroup,@Spell
365  TexFold syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	contains=@texFoldGroup,@Spell
366  TexFold syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													contains=@texFoldGroup,@Spell
367  TexFold syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											contains=@texFoldGroup,@Spell
368 else
369  TexFold syn region texDocZone			matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}'											contains=@texFoldGroup,@texDocGroup
370  TexFold syn region texPartZone		matchgroup=texSection start='\\part\>'			 end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)'								contains=@texFoldGroup,@texPartGroup
371  TexFold syn region texChapterZone		matchgroup=texSection start='\\chapter\>'		 end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)'							contains=@texFoldGroup,@texChapterGroup
372  TexFold syn region texSectionZone		matchgroup=texSection start='\\section\>'		 end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'					contains=@texFoldGroup,@texSectionGroup
373  TexFold syn region texSubSectionZone		matchgroup=texSection start='\\subsection\>'		 end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSectionGroup
374  TexFold syn region texSubSubSectionZone	matchgroup=texSection start='\\subsubsection\>'		 end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'				contains=@texFoldGroup,@texSubSubSectionGroup
375  TexFold syn region texParaZone		matchgroup=texSection start='\\paragraph\>'		 end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'			contains=@texFoldGroup,@texParaGroup
376  TexFold syn region texSubParaZone		matchgroup=texSection start='\\subparagraph\>'		 end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)'	contains=@texFoldGroup
377  TexFold syn region texTitle			matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}'													contains=@texFoldGroup
378  TexFold syn region texAbstract		matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}'											contains=@texFoldGroup
379  endif
380endif
381
382" particular support for bold and italic {{{1
383if s:tex_fast =~# 'b'
384  if s:tex_conceal =~# 'b'
385   if !exists("g:tex_nospell") || !g:tex_nospell
386    syn region texBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texBoldGroup,@Spell
387    syn region texBoldItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texItalGroup,@Spell
388    syn region texItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texItalGroup,@Spell
389    syn region texItalBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texBoldGroup,@Spell
390   else
391    syn region texBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texBoldGroup
392    syn region texBoldItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texItalGroup
393    syn region texItalStyle	matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texItalGroup
394    syn region texItalBoldStyle	matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle  end="}" concealends contains=@texBoldGroup
395   endif
396  endif
397endif
398
399" Bad Math (mismatched): {{{1
400if !exists("g:tex_no_math") && !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("g: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 s: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\>"	keepend concealends 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("g: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 !s: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 s: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   TexFold syn region texComment						start="^\zs\s*%.*\_s*%"	skip="^\s*%"	end='^\ze\s*[^%]'	contains=@texCommentGroup
577   TexFold syn region texNoSpell	contained	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 !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"  syn match texMathSymbol '\\bar{a}' contained conceal cchar=a̅
999 endif
1000
1001 " Greek {{{2
1002 if s:tex_conceal =~# 'g'
1003  fun! s:Greek(group,pat,cchar)
1004    exe 'syn match '.a:group." '".a:pat."' contained conceal cchar=".a:cchar
1005  endfun
1006  call s:Greek('texGreek','\\alpha\>'		,'α')
1007  call s:Greek('texGreek','\\beta\>'		,'β')
1008  call s:Greek('texGreek','\\gamma\>'		,'γ')
1009  call s:Greek('texGreek','\\delta\>'		,'δ')
1010  call s:Greek('texGreek','\\epsilon\>'		,'ϵ')
1011  call s:Greek('texGreek','\\varepsilon\>'	,'ε')
1012  call s:Greek('texGreek','\\zeta\>'		,'ζ')
1013  call s:Greek('texGreek','\\eta\>'		,'η')
1014  call s:Greek('texGreek','\\theta\>'		,'θ')
1015  call s:Greek('texGreek','\\vartheta\>'	,'ϑ')
1016  call s:Greek('texGreek','\\kappa\>'		,'κ')
1017  call s:Greek('texGreek','\\lambda\>'		,'λ')
1018  call s:Greek('texGreek','\\mu\>'		,'μ')
1019  call s:Greek('texGreek','\\nu\>'		,'ν')
1020  call s:Greek('texGreek','\\xi\>'		,'ξ')
1021  call s:Greek('texGreek','\\pi\>'		,'π')
1022  call s:Greek('texGreek','\\varpi\>'		,'ϖ')
1023  call s:Greek('texGreek','\\rho\>'		,'ρ')
1024  call s:Greek('texGreek','\\varrho\>'		,'ϱ')
1025  call s:Greek('texGreek','\\sigma\>'		,'σ')
1026  call s:Greek('texGreek','\\varsigma\>'	,'ς')
1027  call s:Greek('texGreek','\\tau\>'		,'τ')
1028  call s:Greek('texGreek','\\upsilon\>'		,'υ')
1029  call s:Greek('texGreek','\\phi\>'		,'ϕ')
1030  call s:Greek('texGreek','\\varphi\>'		,'φ')
1031  call s:Greek('texGreek','\\chi\>'		,'χ')
1032  call s:Greek('texGreek','\\psi\>'		,'ψ')
1033  call s:Greek('texGreek','\\omega\>'		,'ω')
1034  call s:Greek('texGreek','\\Gamma\>'		,'Γ')
1035  call s:Greek('texGreek','\\Delta\>'		,'Δ')
1036  call s:Greek('texGreek','\\Theta\>'		,'Θ')
1037  call s:Greek('texGreek','\\Lambda\>'		,'Λ')
1038  call s:Greek('texGreek','\\Xi\>'		,'Χ')
1039  call s:Greek('texGreek','\\Pi\>'		,'Π')
1040  call s:Greek('texGreek','\\Sigma\>'		,'Σ')
1041  call s:Greek('texGreek','\\Upsilon\>'		,'Υ')
1042  call s:Greek('texGreek','\\Phi\>'		,'Φ')
1043  call s:Greek('texGreek','\\Psi\>'		,'Ψ')
1044  call s:Greek('texGreek','\\Omega\>'		,'Ω')
1045  delfun s:Greek
1046 endif
1047
1048 " Superscripts/Subscripts {{{2
1049 if s:tex_conceal =~# 's'
1050  if s:tex_fast =~# 's'
1051   syn region texSuperscript	matchgroup=Delimiter start='\^{'	skip="\\\\\|\\[{}]" end='}'	contained concealends contains=texSpecialChar,texSuperscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
1052   syn region texSubscript	matchgroup=Delimiter start='_{'		skip="\\\\\|\\[{}]" end='}'	contained concealends contains=texSpecialChar,texSubscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
1053  endif
1054  " s:SuperSub:
1055  fun! s:SuperSub(group,leader,pat,cchar)
1056    if a:pat =~# '^\\' || (a:leader == '\^' && a:pat =~# s:tex_superscripts) || (a:leader == '_' && a:pat =~# s:tex_subscripts)
1057"     call Decho("SuperSub: group<".a:group."> leader<".a:leader."> pat<".a:pat."> cchar<".a:cchar.">")
1058     exe 'syn match '.a:group." '".a:leader.a:pat."' contained conceal cchar=".a:cchar
1059     exe 'syn match '.a:group."s '".a:pat        ."' contained conceal cchar=".a:cchar.' nextgroup='.a:group.'s'
1060    endif
1061  endfun
1062  call s:SuperSub('texSuperscript','\^','0','⁰')
1063  call s:SuperSub('texSuperscript','\^','1','¹')
1064  call s:SuperSub('texSuperscript','\^','2','²')
1065  call s:SuperSub('texSuperscript','\^','3','³')
1066  call s:SuperSub('texSuperscript','\^','4','⁴')
1067  call s:SuperSub('texSuperscript','\^','5','⁵')
1068  call s:SuperSub('texSuperscript','\^','6','⁶')
1069  call s:SuperSub('texSuperscript','\^','7','⁷')
1070  call s:SuperSub('texSuperscript','\^','8','⁸')
1071  call s:SuperSub('texSuperscript','\^','9','⁹')
1072  call s:SuperSub('texSuperscript','\^','a','ᵃ')
1073  call s:SuperSub('texSuperscript','\^','b','ᵇ')
1074  call s:SuperSub('texSuperscript','\^','c','ᶜ')
1075  call s:SuperSub('texSuperscript','\^','d','ᵈ')
1076  call s:SuperSub('texSuperscript','\^','e','ᵉ')
1077  call s:SuperSub('texSuperscript','\^','f','ᶠ')
1078  call s:SuperSub('texSuperscript','\^','g','ᵍ')
1079  call s:SuperSub('texSuperscript','\^','h','ʰ')
1080  call s:SuperSub('texSuperscript','\^','i','ⁱ')
1081  call s:SuperSub('texSuperscript','\^','j','ʲ')
1082  call s:SuperSub('texSuperscript','\^','k','ᵏ')
1083  call s:SuperSub('texSuperscript','\^','l','ˡ')
1084  call s:SuperSub('texSuperscript','\^','m','ᵐ')
1085  call s:SuperSub('texSuperscript','\^','n','ⁿ')
1086  call s:SuperSub('texSuperscript','\^','o','ᵒ')
1087  call s:SuperSub('texSuperscript','\^','p','ᵖ')
1088  call s:SuperSub('texSuperscript','\^','r','ʳ')
1089  call s:SuperSub('texSuperscript','\^','s','ˢ')
1090  call s:SuperSub('texSuperscript','\^','t','ᵗ')
1091  call s:SuperSub('texSuperscript','\^','u','ᵘ')
1092  call s:SuperSub('texSuperscript','\^','v','ᵛ')
1093  call s:SuperSub('texSuperscript','\^','w','ʷ')
1094  call s:SuperSub('texSuperscript','\^','x','ˣ')
1095  call s:SuperSub('texSuperscript','\^','y','ʸ')
1096  call s:SuperSub('texSuperscript','\^','z','ᶻ')
1097  call s:SuperSub('texSuperscript','\^','A','ᴬ')
1098  call s:SuperSub('texSuperscript','\^','B','ᴮ')
1099  call s:SuperSub('texSuperscript','\^','D','ᴰ')
1100  call s:SuperSub('texSuperscript','\^','E','ᴱ')
1101  call s:SuperSub('texSuperscript','\^','G','ᴳ')
1102  call s:SuperSub('texSuperscript','\^','H','ᴴ')
1103  call s:SuperSub('texSuperscript','\^','I','ᴵ')
1104  call s:SuperSub('texSuperscript','\^','J','ᴶ')
1105  call s:SuperSub('texSuperscript','\^','K','ᴷ')
1106  call s:SuperSub('texSuperscript','\^','L','ᴸ')
1107  call s:SuperSub('texSuperscript','\^','M','ᴹ')
1108  call s:SuperSub('texSuperscript','\^','N','ᴺ')
1109  call s:SuperSub('texSuperscript','\^','O','ᴼ')
1110  call s:SuperSub('texSuperscript','\^','P','ᴾ')
1111  call s:SuperSub('texSuperscript','\^','R','ᴿ')
1112  call s:SuperSub('texSuperscript','\^','T','ᵀ')
1113  call s:SuperSub('texSuperscript','\^','U','ᵁ')
1114  call s:SuperSub('texSuperscript','\^','W','ᵂ')
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('texSuperscript','\^','\.','˙')
1126  call s:SuperSub('texSuperscript','\^','=','˭')
1127  call s:SuperSub('texSubscript','_','0','₀')
1128  call s:SuperSub('texSubscript','_','1','₁')
1129  call s:SuperSub('texSubscript','_','2','₂')
1130  call s:SuperSub('texSubscript','_','3','₃')
1131  call s:SuperSub('texSubscript','_','4','₄')
1132  call s:SuperSub('texSubscript','_','5','₅')
1133  call s:SuperSub('texSubscript','_','6','₆')
1134  call s:SuperSub('texSubscript','_','7','₇')
1135  call s:SuperSub('texSubscript','_','8','₈')
1136  call s:SuperSub('texSubscript','_','9','₉')
1137  call s:SuperSub('texSubscript','_','a','ₐ')
1138  call s:SuperSub('texSubscript','_','e','ₑ')
1139  call s:SuperSub('texSubscript','_','i','ᵢ')
1140  call s:SuperSub('texSubscript','_','o','ₒ')
1141  call s:SuperSub('texSubscript','_','u','ᵤ')
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','_',')','₎')
1148  call s:SuperSub('texSubscript','_','\.','‸')
1149  call s:SuperSub('texSubscript','_','r','ᵣ')
1150  call s:SuperSub('texSubscript','_','v','ᵥ')
1151  call s:SuperSub('texSubscript','_','x','ₓ')
1152  call s:SuperSub('texSubscript','_','\\beta\>' ,'ᵦ')
1153  call s:SuperSub('texSubscript','_','\\delta\>','ᵨ')
1154  call s:SuperSub('texSubscript','_','\\phi\>'  ,'ᵩ')
1155  call s:SuperSub('texSubscript','_','\\gamma\>','ᵧ')
1156  call s:SuperSub('texSubscript','_','\\chi\>'  ,'ᵪ')
1157  delfun s:SuperSub
1158 endif
1159
1160 " Accented characters: {{{2
1161 if s:tex_conceal =~# 'a'
1162  if b:tex_stylish
1163   syn match texAccent		"\\[bcdvuH][^a-zA-Z@]"me=e-1
1164   syn match texLigature		"\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)[^a-zA-Z@]"me=e-1
1165  else
1166   fun! s:Accents(chr,...)
1167     let i= 1
1168     for accent in ["`","\\'","^",'"','\~','\.','=',"c","H","k","r","u","v"]
1169      if i > a:0
1170       break
1171      endif
1172      if strlen(a:{i}) == 0 || a:{i} == ' ' || a:{i} == '?'
1173       let i= i + 1
1174       continue
1175      endif
1176      if accent =~# '\a'
1177       exe "syn match texAccent '".'\\'.accent.'\(\s*{'.a:chr.'}\|\s\+'.a:chr.'\)'."' conceal cchar=".a:{i}
1178      else
1179       exe "syn match texAccent '".'\\'.accent.'\s*\({'.a:chr.'}\|'.a:chr.'\)'."' conceal cchar=".a:{i}
1180      endif
1181      let i= i + 1
1182     endfor
1183   endfun
1184   "                  \`  \'  \^  \"  \~  \.  \=  \c  \H  \k  \r  \u  \v
1185   call s:Accents('a','à','á','â','ä','ã','ȧ','ā',' ',' ','ą','å','ă','ǎ')
1186   call s:Accents('A','À','Á','Â','Ä','Ã','Ȧ','Ā',' ',' ','Ą','Å','Ă','Ǎ')
1187   call s:Accents('c',' ','ć','ĉ',' ',' ','ċ',' ','ç',' ',' ',' ',' ','č')
1188   call s:Accents('C',' ','Ć','Ĉ',' ',' ','Ċ',' ','Ç',' ',' ',' ',' ','Č')
1189   call s:Accents('d',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ď')
1190   call s:Accents('D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ď')
1191   call s:Accents('e','è','é','ê','ë','ẽ','ė','ē','ȩ',' ','ę',' ','ĕ','ě')
1192   call s:Accents('E','È','É','Ê','Ë','Ẽ','Ė','Ē','Ȩ',' ','Ę',' ','Ĕ','Ě')
1193   call s:Accents('g',' ','ǵ','ĝ',' ',' ','ġ',' ','ģ',' ',' ',' ','ğ','ǧ')
1194   call s:Accents('G',' ','Ǵ','Ĝ',' ',' ','Ġ',' ','Ģ',' ',' ',' ','Ğ','Ǧ')
1195   call s:Accents('h',' ',' ','ĥ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ȟ')
1196   call s:Accents('H',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ȟ')
1197   call s:Accents('i','ì','í','î','ï','ĩ','į','ī',' ',' ','į',' ','ĭ','ǐ')
1198   call s:Accents('I','Ì','Í','Î','Ï','Ĩ','İ','Ī',' ',' ','Į',' ','Ĭ','Ǐ')
1199   call s:Accents('J',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ǰ')
1200   call s:Accents('k',' ',' ',' ',' ',' ',' ',' ','ķ',' ',' ',' ',' ','ǩ')
1201   call s:Accents('K',' ',' ',' ',' ',' ',' ',' ','Ķ',' ',' ',' ',' ','Ǩ')
1202   call s:Accents('l',' ','ĺ','ľ',' ',' ',' ',' ','ļ',' ',' ',' ',' ','ľ')
1203   call s:Accents('L',' ','Ĺ','Ľ',' ',' ',' ',' ','Ļ',' ',' ',' ',' ','Ľ')
1204   call s:Accents('n',' ','ń',' ',' ','ñ',' ',' ','ņ',' ',' ',' ',' ','ň')
1205   call s:Accents('N',' ','Ń',' ',' ','Ñ',' ',' ','Ņ',' ',' ',' ',' ','Ň')
1206   call s:Accents('o','ò','ó','ô','ö','õ','ȯ','ō',' ','ő','ǫ',' ','ŏ','ǒ')
1207   call s:Accents('O','Ò','Ó','Ô','Ö','Õ','Ȯ','Ō',' ','Ő','Ǫ',' ','Ŏ','Ǒ')
1208   call s:Accents('r',' ','ŕ',' ',' ',' ',' ',' ','ŗ',' ',' ',' ',' ','ř')
1209   call s:Accents('R',' ','Ŕ',' ',' ',' ',' ',' ','Ŗ',' ',' ',' ',' ','Ř')
1210   call s:Accents('s',' ','ś','ŝ',' ',' ',' ',' ','ş',' ','ȿ',' ',' ','š')
1211   call s:Accents('S',' ','Ś','Ŝ',' ',' ',' ',' ','Ş',' ',' ',' ',' ','Š')
1212   call s:Accents('t',' ',' ',' ',' ',' ',' ',' ','ţ',' ',' ',' ',' ','ť')
1213   call s:Accents('T',' ',' ',' ',' ',' ',' ',' ','Ţ',' ',' ',' ',' ','Ť')
1214   call s:Accents('u','ù','ú','û','ü','ũ',' ','ū',' ','ű','ų','ů','ŭ','ǔ')
1215   call s:Accents('U','Ù','Ú','Û','Ü','Ũ',' ','Ū',' ','Ű','Ų','Ů','Ŭ','Ǔ')
1216   call s:Accents('w',' ',' ','ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
1217   call s:Accents('W',' ',' ','Ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
1218   call s:Accents('y','ỳ','ý','ŷ','ÿ','ỹ',' ',' ',' ',' ',' ',' ',' ',' ')
1219   call s:Accents('Y','Ỳ','Ý','Ŷ','Ÿ','Ỹ',' ',' ',' ',' ',' ',' ',' ',' ')
1220   call s:Accents('z',' ','ź',' ',' ',' ','ż',' ',' ',' ',' ',' ',' ','ž')
1221   call s:Accents('Z',' ','Ź',' ',' ',' ','Ż',' ',' ',' ',' ',' ',' ','Ž')
1222   call s:Accents('\\i','ì','í','î','ï','ĩ','į',' ',' ',' ',' ',' ','ĭ',' ')
1223   "                    \`  \'  \^  \"  \~  \.  \=  \c  \H  \k  \r  \u  \v
1224   delfun s:Accents
1225   syn match texAccent   '\\aa\>'	conceal cchar=å
1226   syn match texAccent   '\\AA\>'	conceal cchar=Å
1227   syn match texAccent	'\\o\>'		conceal cchar=ø
1228   syn match texAccent	'\\O\>'		conceal cchar=Ø
1229   syn match texLigature	'\\AE\>'	conceal cchar=Æ
1230   syn match texLigature	'\\ae\>'	conceal cchar=æ
1231   syn match texLigature	'\\oe\>'	conceal cchar=œ
1232   syn match texLigature	'\\OE\>'	conceal cchar=Œ
1233   syn match texLigature	'\\ss\>'	conceal cchar=ß
1234  endif
1235 endif
1236endif
1237
1238" ---------------------------------------------------------------------
1239" LaTeX synchronization: {{{1
1240syn sync maxlines=200
1241syn sync minlines=50
1242
1243syn  sync match texSyncStop			groupthere NONE		"%stopzone\>"
1244
1245" Synchronization: {{{1
1246" The $..$ and $$..$$ make for impossible sync patterns
1247" (one can't tell if a "$$" starts or stops a math zone by itself)
1248" The following grouptheres coupled with minlines above
1249" help improve the odds of good syncing.
1250if !exists("g:tex_no_math")
1251 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{abstract}"
1252 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{center}"
1253 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{description}"
1254 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{enumerate}"
1255 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{itemize}"
1256 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{table}"
1257 syn sync match texSyncMathZoneA		groupthere NONE		"\\end{tabular}"
1258 syn sync match texSyncMathZoneA		groupthere NONE		"\\\(sub\)*section\>"
1259endif
1260
1261" ---------------------------------------------------------------------
1262" Highlighting: {{{1
1263if did_tex_syntax_inits == 1
1264 let did_tex_syntax_inits= 2
1265  " TeX highlighting groups which should share similar highlighting
1266  if !exists("g:tex_no_error")
1267   if !exists("g:tex_no_math")
1268    HiLink texBadMath		texError
1269    HiLink texMathDelimBad	texError
1270    HiLink texMathError		texError
1271    if !b:tex_stylish
1272      HiLink texOnlyMath	texError
1273    endif
1274   endif
1275   HiLink texError		Error
1276  endif
1277
1278  hi texBoldStyle		gui=bold	cterm=bold
1279  hi texItalStyle		gui=italic	cterm=italic
1280  hi texBoldItalStyle		gui=bold,italic cterm=bold,italic
1281  hi texItalBoldStyle		gui=bold,italic cterm=bold,italic
1282  HiLink texCite		texRefZone
1283  HiLink texDefCmd		texDef
1284  HiLink texDefName		texDef
1285  HiLink texDocType		texCmdName
1286  HiLink texDocTypeArgs		texCmdArgs
1287  HiLink texInputFileOpt	texCmdArgs
1288  HiLink texInputCurlies	texDelimiter
1289  HiLink texLigature		texSpecialChar
1290  if !exists("g:tex_no_math")
1291   HiLink texMathDelimSet1	texMathDelim
1292   HiLink texMathDelimSet2	texMathDelim
1293   HiLink texMathDelimKey	texMathDelim
1294   HiLink texMathMatcher	texMath
1295   HiLink texAccent		texStatement
1296   HiLink texGreek		texStatement
1297   HiLink texSuperscript	texStatement
1298   HiLink texSubscript		texStatement
1299   HiLink texSuperscripts 	texSuperscript
1300   HiLink texSubscripts 	texSubscript
1301   HiLink texMathSymbol		texStatement
1302   HiLink texMathZoneV		texMath
1303   HiLink texMathZoneW		texMath
1304   HiLink texMathZoneX		texMath
1305   HiLink texMathZoneY		texMath
1306   HiLink texMathZoneV		texMath
1307   HiLink texMathZoneZ		texMath
1308  endif
1309  HiLink texBeginEnd		texCmdName
1310  HiLink texBeginEndName	texSection
1311  HiLink texSpaceCode		texStatement
1312  HiLink texStyleStatement	texStatement
1313  HiLink texTypeSize		texType
1314  HiLink texTypeStyle		texType
1315
1316   " Basic TeX highlighting groups
1317  HiLink texCmdArgs		Number
1318  HiLink texCmdName		Statement
1319  HiLink texComment		Comment
1320  HiLink texDef			Statement
1321  HiLink texDefParm		Special
1322  HiLink texDelimiter		Delimiter
1323  HiLink texInput		Special
1324  HiLink texInputFile		Special
1325  HiLink texLength		Number
1326  HiLink texMath		Special
1327  HiLink texMathDelim		Statement
1328  HiLink texMathOper		Operator
1329  HiLink texNewCmd		Statement
1330  HiLink texNewEnv		Statement
1331  HiLink texOption		Number
1332  HiLink texRefZone		Special
1333  HiLink texSection		PreCondit
1334  HiLink texSpaceCodeChar	Special
1335  HiLink texSpecialChar		SpecialChar
1336  HiLink texStatement		Statement
1337  HiLink texString		String
1338  HiLink texTodo		Todo
1339  HiLink texType		Type
1340  HiLink texZone		PreCondit
1341
1342  delcommand HiLink
1343endif
1344
1345" Cleanup: {{{1
1346delc TexFold
1347unlet s:extfname
1348let   b:current_syntax = "tex"
1349let &cpo               = s:keepcpo
1350unlet s:keepcpo
1351" vim: ts=8 fdm=marker
1352