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