Update runtime files.
diff --git a/runtime/syntax/2html.vim b/runtime/syntax/2html.vim
index ddc7819..4a2d1d3 100644
--- a/runtime/syntax/2html.vim
+++ b/runtime/syntax/2html.vim
@@ -1,6 +1,6 @@
 " Vim syntax support file
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2015 Sep 08
+" Last Change: 2018 Nov 11
 "
 " Additional contributors:
 "
@@ -633,6 +633,45 @@
   let s:current_syntax = 'none'
 endif
 
+" If the user is sourcing this script directly then the plugin version isn't
+" known because the main plugin script didn't load. In the usual case where the
+" user still has the full Vim runtime installed, or has this full plugin
+" installed in a package or something, then we can extract the version from the
+" main plugin file at it's usual spot relative to this file. Otherwise the user
+" is assembling their runtime piecemeal and we have no idea what versions of
+" other files may be present so don't even try to make a guess or assume the
+" presence of other specific files with specific meaning.
+"
+" We don't want to actually source the main plugin file here because the user
+" may have a good reason not to (e.g. they define their own TOhtml command or
+" something).
+"
+" If this seems way too complicated and convoluted, it is. Probably I should
+" have put the version information in the autoload file from the start. But the
+" version has been in the global variable for so long that changing it could
+" break a lot of user scripts.
+if exists("g:loaded_2html_plugin")
+  let s:pluginversion = g:loaded_2html_plugin
+else
+  if !exists("g:unloaded_tohtml_plugin")
+    let s:main_plugin_path = expand("<sfile>:p:h:h")."/plugin/tohtml.vim"
+    if filereadable(s:main_plugin_path)
+      let s:lines = readfile(s:main_plugin_path, "", 20)
+      call filter(s:lines, 'v:val =~ "loaded_2html_plugin = "')
+      if empty(s:lines)
+	let g:unloaded_tohtml_plugin = "unknown"
+      else
+	let g:unloaded_tohtml_plugin = substitute(s:lines[0], '.*loaded_2html_plugin = \([''"]\)\(\%(\1\@!.\)\+\)\1', '\2', '')
+      endif
+      unlet s:lines
+    else
+      let g:unloaded_tohtml_plugin = "unknown"
+    endif
+    unlet s:main_plugin_path
+  endif
+  let s:pluginversion = g:unloaded_tohtml_plugin
+endif
+
 " Split window to create a buffer with the HTML file.
 let s:orgbufnr = winbufnr(0)
 let s:origwin_stl = &l:stl
@@ -721,7 +760,7 @@
 call extend(s:lines, [
       \ ("<title>".expand("%:p:~")."</title>"),
       \ ("<meta name=\"Generator\" content=\"Vim/".v:version/100.".".v:version%100.'"'.s:tag_close),
-      \ ("<meta name=\"plugin-version\" content=\"".g:loaded_2html_plugin.'"'.s:tag_close)
+      \ ("<meta name=\"plugin-version\" content=\"".s:pluginversion.'"'.s:tag_close)
       \ ])
 call add(s:lines, '<meta name="syntax" content="'.s:current_syntax.'"'.s:tag_close)
 call add(s:lines, '<meta name="settings" content="'.
@@ -807,12 +846,15 @@
   endif
 endif
 
-" insert script tag; javascript is always needed for the line number
-" normalization for URL hashes
-call extend(s:lines, [
-      \ "",
-      \ "<script type='text/javascript'>",
-      \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids || !empty(s:settings.prevent_copy)
+
+" insert script tag if needed
+if s:uses_script
+  call extend(s:lines, [
+        \ "",
+        \ "<script type='text/javascript'>",
+        \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+endif
 
 " insert javascript to toggle folds open and closed
 if s:settings.dynamic_folds
@@ -849,8 +891,9 @@
 	\ "  if (lineNum.indexOf('L') == -1) {",
 	\ "    lineNum = 'L'+lineNum;",
 	\ "  }",
-	\ "  lineElem = document.getElementById(lineNum);"
+	\ "  var lineElem = document.getElementById(lineNum);"
 	\ ])
+
   if s:settings.dynamic_folds
     call extend(s:lines, [
 	  \ "",
@@ -940,12 +983,14 @@
 	\ ])
 endif
 
-" insert script closing tag
-call extend(s:lines, [
-      \ '',
-      \ s:settings.use_xhtml ? '//]]>' : '-->',
-      \ "</script>"
-      \ ])
+" insert script closing tag if needed
+if s:uses_script
+  call extend(s:lines, [
+        \ '',
+        \ s:settings.use_xhtml ? '//]]>' : '-->',
+        \ "</script>"
+        \ ])
+endif
 
 call extend(s:lines, ["</head>"])
 if !empty(s:settings.prevent_copy)
@@ -1525,10 +1570,22 @@
 	if s:settings.expand_tabs
 	  let s:offset = 0
 	  let s:idx = stridx(s:expandedtab, "\t")
+	  let s:tablist = split(&vts,',')
+	  if empty(s:tablist)
+	    let s:tablist = [ &ts ]
+	  endif
+	  let s:tabidx = 0
+	  let s:tabwidth = 0
 	  while s:idx >= 0
+	    while s:startcol+s:idx > s:tabwidth + s:tablist[s:tabidx] 
+	      let s:tabwidth += s:tablist[s:tabidx]
+	      if s:tabidx < len(s:tablist)-1
+		let s:tabidx = s:tabidx+1
+	      endif
+	    endwhile
 	    if has("multi_byte_encoding")
 	      if s:startcol + s:idx == 1
-		let s:i = &ts
+		let s:i = s:tablist[s:tabidx]
 	      else
 		if s:idx == 0
 		  let s:prevc = matchstr(s:line, '.\%' . (s:startcol + s:idx + s:offset) . 'c')
@@ -1536,11 +1593,11 @@
 		  let s:prevc = matchstr(s:expandedtab, '.\%' . (s:idx + 1) . 'c')
 		endif
 		let s:vcol = virtcol([s:lnum, s:startcol + s:idx + s:offset - len(s:prevc)])
-		let s:i = &ts - (s:vcol % &ts)
+		let s:i = s:tablist[s:tabidx] - (s:vcol - s:tabwidth)
 	      endif
 	      let s:offset -= s:i - 1
 	    else
-	      let s:i = &ts - ((s:idx + s:startcol - 1) % &ts)
+	      let s:i = s:tablist[s:tabidx] - ((s:idx + s:startcol - 1) - s:tabwidth)
 	    endif
 	    let s:expandedtab = substitute(s:expandedtab, '\t', repeat(' ', s:i), '')
 	    let s:idx = stridx(s:expandedtab, "\t")