"+-------------------------------------------------+ "| | "| VIM macros for Latex | "| | "| Tomer Kol | "| | "| Version: 0.25 | "| Last changed: 1 Mar 1999 | "| | "| Copyright: 1998,1999 Tomer Kol | "| | "| This work is distributed under the GPL | "| ("GNU GENERAL PUBLIC LICENSE" version 2 or | "| any later version) and is provided "as is". | "| | "| If you fix bugs/enhance it, please send me | "| a copy, so I may include it in the "official" | "| version. | "| | "| Email: tkol@psl-palm.technion.ac.il | "+-------------------------------------------------+ " See initialization code at the end of the file "+=====================================================+ "|| || "|| Functions || "|| || "+=====================================================+ "+=====================================================+ "| | "| Auxiliary functions | "| | "+=====================================================+ "+-----------------------------------------------------+ "| TKisFirstFileNewer | "| Returns: 1 first file is newer | "| 0 first file is not newer | "| -1 Error | "| NOTE: uses the "ls -1t" function -- make sure you | "| have it (e.g, for Win* you'll need ls.exe) | "+-----------------------------------------------------+ function! TKisFirstFileNewer(FileA, FileB) let Res =-1 if filereadable(a:FileA) if filereadable(a:FileB) if has("win32") " NT dir /O-D /B exe "normal :read! dir /O-D /B ".a:FileA." ".a:FileB."\" else exe "normal :read! ls -t1 ".a:FileA." ".a:FileB."\" endif exe "-1" let NewerFile = getline(".") let Res = ( NewerFile == a:FileA) "remove traces exe "normal u" endif endif return Res endfunction "+-----------------------------------------------------+ "| TKinsertline(content) | "+-----------------------------------------------------+ function! TKinsertline(content) exe "normal i".a:content."\\" endfunction "+=====================================================+ "| | "| Functions for support of producing/viewing LaTeX | "| and for the gui. | "| | "+=====================================================+ "+-----------------------------------------------------+ "| TKSetTeXfileName(...) | "| | "| MODE: 0 (default) set name of current buffer | "| 1 query user | "| 2 Set to the second parameter | "| 3 Just verify that file is in the current | "| directory. | "+-----------------------------------------------------+ function! TKSetTeXfileName(...) if a:0 == 0 let g:TeXfile = bufname("%") else "we have parameters if a:1 == 0 let g:TeXfile = bufname("%") elseif a:1 == 1 if ! exists("g:TeXfile") let InputPrompt= "\nThe name of the main TeX file was not defined yet.\n" let g:TeXfile = bufname("%") else let InputPrompt= "\nThe current name of the main TeX file is " let InputPrompt= InputPrompt.g:TeXfile."\n" endif let InputPrompt= InputPrompt."\nEnter name of the main TeX file \[" let InputPrompt= InputPrompt.g:TeXfile."\]\n" let EnteredFileName=input(InputPrompt) if EnteredFileName != "" let g:TeXfile = EnteredFileName endif elseif a:1 == 2 if a:0 > 1 " we need a second parameter let g:TeXfile = a:2 endif endif endif let FilePath = fnamemodify(g:TeXfile, ":p:h") if FilePath != getcwd() let Msg = "TeX file (".g:TeXfile.") is not in the current " let Msg = Msg."directory \n(which is ".getcwd().")\n\n" let Msg = Msg."NOTE: auxiliary files (idx etc.) are looked for\n" let Msg = Msg." in the current directory\n\n" let Msg = Msg."choose \"Change dir\" to go to the file\'s directory" let Msg = Msg." (RECOMMENDED)\n" let RC = confirm(Msg,"&Change dir\nKeep current dir", 1) if RC == 1 exe "cd ".FilePath let g:TeXfile = fnamemodify(g:TeXfile, ":t") endif endif call TKSetTitle() endfunction "+-----------------------------------------------------+ "| TKMakeDVIfile | "| (based on latexn + changes) | "| | "| NOTE: tested using LaTeX2e (2.09 not tested) | "| | "| | "| optional argument - max number of iterations | "| (5 will ensure correct DVI) | "| | "| NOTE: Due to win95 bug, shell_error is always 0, | "| thus it will always make 5 iterations. | "| Solution: 1. Change your operating system ;-) | "| (I recommend Linux, but NT will do) | "| 2. Call the function with the optional | "| argument. | "+-----------------------------------------------------+ function! TKMakeDVIfile(...) if ! exists("g:TeXfile") call TKSetTeXfileName() endif " Verify file exists if ! filereadable(g:TeXfile) let Msg = "TeX file ".g:TeXfile." unreadable !!! \n" let Msg = Msg."Wrong name ?? \n\n" let Msg = Msg."NOTE: the current directory is ".getcwd()." \n" let Msg = Msg." the current buffer's path is " let Msg = Msg.fnamemodify(bufname("%"), ":p:h")."\n\n" let RC = confirm(Msg, "&OK") return 1 else " verify TeX file is in the current directory call TKSetTeXfileName(3) endif let TeXfileBasename = fnamemodify(g:TeXfile, ":t:r") " don't stop when the screen fills let OrigMoreVal = &more let &more=0 let OrigMakeProg = &mp """"""""""""""""""""""""""""""""" " Rerun enough times """"""""""""""""""""""""""""""""" let Count = 0 let NeedToRerun = 1 if a:0 > 0 let MaxRuns = a:1 else let MaxRuns = 5 endif " There is no point in running more then 5 iterations if MaxRuns > 5 let MaxRuns = 5 endif while NeedToRerun && Count < MaxRuns let NeedToRerun = 0 let Count = Count + 1 echo "\n>>> Beginning LaTeX Run # ".Count." <<<\n" if g:TKenableHebrew " fix .out file if there is one (for Hebrew PDF) call TKfixHebrewOUTfile(TeXfileBasename.".out") endif "backup old idx file, then run Makeindex if filereadable(TeXfileBasename.".idx") "let Execom = "!".g:TKcpCmd." ".TeXfileBasename.".idx " let &mp = g:TKcpCmd let Execom = "make ".TeXfileBasename.".idx " let Execom = Execom.TeXfileBasename.".idx.bak" execute Execom let &mp = "makeindex" let Execom = "make ".TeXfileBasename.".idx" execute Execom endif " Run bibtex if needed if filereadable(TeXfileBasename.".aux") " see if bibtex is needed let &mp="grep" let Execom = "make -q \\\"bibdata{\\\" ".TeXfileBasename.".aux" execute Execom "grep exit status is 0 if it finds the word Rerun" " The information bibtex reads is pass independent if shell_error == 0 && Count == 1 let &mp="bibtex" let Execom = "make ".TeXfileBasename execute Execom endif endif " make a backup of old bbl file if filereadable(TeXfileBasename.".bbl") let &mp = g:TKcpCmd let Execom = "make ".TeXfileBasename.".bbl " let Execom = Execom.TeXfileBasename.".bbl.bak" execute Execom endif " latex the file echo ">>>> Running LaTeX <<<<<<" " cannot use make on win32 as ther is no way to if ! has("win32") let &mp = g:TKlatexProg let Execom = "make ".g:TeXfile else let Execom = "!".g:TKlatexProg." ".g:TeXfile endif let Execom = "!".g:TKlatexProg." ".g:TeXfile execute Execom "Abort on errors ? if shell_error != 0 let Msg = ">>>>> LaTeX returned error <<<<< n\n" let Msg = Msg." " let RC=confirm(Msg, "&Abort\n&Load log file\n&Jump to Error") if RC == 1 return 1 elseif RC == 2 execute "normal :split\:e ".TeXfileBasename.".log\" execute "normal /^l\\.\" return 1 else " Jump to Error execute "normal :split\:e ".TeXfileBasename.".log\" execute "normal /^l\\.\" let ErrorLine = getline(".") let LineNumEnd = match(ErrorLine, " ") let ErrorLineNum = strpart( ErrorLine, 2, LineNumEnd-1) execute "normal [(" let ErrFileLine = getline(".") " erase the ( to isolate the file's name let St = match(ErrFileLine, "(") let ErrneousFileName = strpart(ErrFileLine, St+1, strlen(ErrFileLine)) execute ":e ".ErrneousFileName execute ":".ErrorLineNum return 1 endif endif " see if we need to Rerun let &mp="grep" let Execom = "make -q Rerun ".TeXfileBasename.".log" execute Execom "grep exit status is 0 if it finds the word Rerun" if shell_error == 0 let NeedToRerun = 1 endif " Run bibtex if needed if filereadable(TeXfileBasename.".aux") " see if bibtex is needed let &mp="grep" let Execom = "make -q \\\"bibdata{\\\" ".TeXfileBasename.".aux" execute Execom "grep exit status is 0 if it finds the word Rerun" " The information bibtex reads is pass independent if shell_error == 0 && Count == 1 let &mp="bibtex" let Execom = "make ".TeXfileBasename execute Execom " See if bbl file changed if ! filereadable(TeXfileBasename.".bbl") if filereadable(TeXfileBasename.".bbl.bak") echo "Deleting useless .bbl.bak file" let &mp=g:TKrmCmd let Execom = "make ".TeXfileBasename.".bbl.bak" execute Execom endif else "Fix .bbl (For Hebrew) ????? needed ? "call "See if idx file changed let &mp="diff" let Execom = "make ".TeXfileBasename.".bbl ".TeXfileBasename.".bbl.bak" let Execom = Execom." > ".g:TKDevNull execute Execom " diff exits with 0 if the files are identical if shell_error != 0 let NeedToRerun = 1 endif endif endif endif " See if idx file changed if ! filereadable(TeXfileBasename.".idx") if filereadable(TeXfileBasename.".idx.bak") echo "Deleting useless .idx.bak file" let &mp=g:TKrmCmd let Execom = "make ".TeXfileBasename.".idx.bak" execute Execom endif else if g:TKenableHebrew "Fix .idx (For Hebrew) call TKfixHebrewIDXfile(TeXfileBasename.".idx") endif "See if idx file changed let &mp="diff" let Execom = "make ".TeXfileBasename.".idx ".TeXfileBasename.".idx.bak" let Execom = Execom." > ".g:TKDevNull execute Execom " diff exits with 0 if the files are identical if shell_error != 0 let NeedToRerun = 1 endif endif endwhile " Remove bak files created let &mp=g:TKrmCmd if filereadable(TeXfileBasename.".idx.bak") let Execom = "make ".TeXfileBasename.".idx.bak" execute Execom endif if filereadable(TeXfileBasename.".bbl.bak") let Execom = "make ".TeXfileBasename.".bbl.bak" execute Execom endif echo ">>>>>>>>> DONE <<<<<<<<<<<<<" echo g:TeXfile." was LaTeXed ".Count." time(s)" echo ">>>>>>>>> DONE <<<<<<<<<<<<<" "restore original value of the more option let &more = OrigMoreVal let &mp = OrigMakeProg return 0 endfunction "+-----------------------------------------------------+ "| TKMakePSfile | "| parameter: | "| "makemode" - regenerate DVI if .tex newer | "+-----------------------------------------------------+ function! TKMakePSfile(...) if ! exists("g:TeXfile") call TKSetTeXfileName() endif let TeXfileBasename = fnamemodify(g:TeXfile, ":t:r") let DVIfilename = TeXfileBasename.".dvi" "verify the dvi file exists if ! filereadable(DVIfilename) " No DVI file found, trying to generate if filereadable(g:TeXfile) let RC = TKMakeDVIfile() if RC != 0 return RC endif endif endif if TKisFirstFileNewer(g:TeXfile, DVIfilename) == 1 " TeX file exists and is newer then DVI file " NOTE: files included from the main tex file are not checked let Remake = "query" if a:0 > 0 if a:1 == "makemode" let Remake = 1 endif endif if Remake == "query" let Msg = "NOTE: ".g:TeXfile." is newer then ".DVIfilename."\n\n" let Msg = Msg."Regenerate DVI file (recommended)?" let Remake = confirm(Msg, "&Yes\n&No", 1) endif if Remake == 1 let RC = TKMakeDVIfile() if RC != 0 return RC endif endif endif if filereadable(DVIfilename) " Call dvips let Execom = "!".g:TKdvi2psProg." -o ".TeXfileBasename.".ps " let Execom = Execom.TeXfileBasename.".dvi" execute Execom else let Msg = "Failed to create DVI file !! \n\n" let Msg = Msg."(".g:TKdvi2psProg." will not be called)\n\n" let RC = confirm(Msg, "&Ok") endif return 0 endfunction "+-----------------------------------------------------+ "| TKMakePDFfile | "| | "+-----------------------------------------------------+ function! TKMakePDFfile() if ! exists("g:TeXfile") call TKSetTeXfileName() endif let TeXfileBasename = fnamemodify(g:TeXfile, ":t:r") let DVIfilename = TeXfileBasename.".dvi" let PSfilename = TeXfileBasename.".ps" "verify the PS file exists if ! filereadable(PSfilename) " No PS file found, trying to generate let RC = TKMakePSfile() if RC != 0 return RC endif endif let NeedMake = 0 let Msg = "" if TKisFirstFileNewer(DVIfilename, PSfilename) == 1 " DVI file exists and is newer then PS file let Msg = "NOTE: ".DVIfilename." is newer then ".PSfilename."\n\n" let NeedMake = 1 endif if TKisFirstFileNewer(g:TeXfile, DVIfilename) == 1 " TeX file exists and is newer then DVI file let Msg = Msg."NOTE: ".g:TeXfile." is newer then ".DVIfilename."\n\n" let NeedMake = 1 endif if NeedMake let Msg = Msg."Regenerate outdated files (recommended)?" let Remake = confirm(Msg, "&Yes\n&No", 1) if Remake == 1 let RC = TKMakePSfile("makemode") if RC != 0 return RC endif endif endif if filereadable(PSfilename) " Call ps2pdf let Execom = "!".g:TKps2pdfConv." ".PSfilename." ".TeXfileBasename.".pdf" echo "\n\n>>> PLEASE WAIT, it takes time <<<\n\n" execute Execom else let Msg = "Failed to create PS file !! \n\n" let Msg = Msg."(".g:TKps2pdfConv." will not be called)\n\n" let RC = confirm(Msg, "&Ok") return 1 endif return 0 endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKLaunchDVIviewer(...) if a:0 > 0 let g:TeXfile = a:1 elseif ! exists("g:TeXfile") call TKSetTeXfileName() endif let DVIfileName = fnamemodify(g:TeXfile, ":t:r").".dvi" if filereadable(DVIfileName) let ExeCmd= g:TKDVIviewer." ".DVIfileName if g:TKdetachedViewers let ExeCmd= g:TKviewerDetachedPre.ExeCmd.g:TKviewerDetachedPost endif exe "!".ExeCmd echo "If fonts should be generated it may take a few seconds" else let RC=confirm(DVIfileName." is unreadable, make sure it exists", "&OK") endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKLaunchPSviewer(...) if a:0 > 0 let g:TeXfile = a:1 elseif ! exists("g:TeXfile") call TKSetTeXfileName() endif let PSfileName = fnamemodify(g:TeXfile, ":t:r").".ps" if filereadable(PSfileName) let ExeCmd= g:TKPSviewer." ".PSfileName if g:TKdetachedViewers let ExeCmd= g:TKviewerDetachedPre.ExeCmd.g:TKviewerDetachedPost endif exe "!".ExeCmd else let RC=confirm(PSfileName." is unreadable, make sure it exists", "&OK") endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKLaunchPDFviewer(...) if a:0 > 0 let g:TeXfile = a:1 elseif ! exists("g:TeXfile") call TKSetTeXfileName() endif let PDFfileName = fnamemodify(g:TeXfile, ":t:r").".pdf" if filereadable(PDFfileName) let ExeCmd= g:TKPDFviewer." ".PDFfileName if g:TKdetachedViewers let ExeCmd= g:TKviewerDetachedPre.ExeCmd.g:TKviewerDetachedPost endif exe "!".ExeCmd else let RC=confirm(PDFfileName." is unreadable, make sure it exists", "&OK") endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKnumToYesNo(Val) if a:Val return "yes" else return "no" endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKQueryPreferences(Msg, PrefVarName) let Msg = a:Msg exe "let CurVal = ".a:PrefVarName let Msg = Msg."\n[current value is \"".TKnumToYesNo(CurVal)."\"]\n" let Msg = Msg."\nFor a permanent setting add to you vimrc file:\n" let Msg = Msg."let ".a:PrefVarName." = 1 (or = 0)\n" let RC = confirm(Msg, "&Yes\n&No", 2-CurVal) " 1 -> 1 , 2 -> 0 exe "let ".a:PrefVarName." = 2 - RC" endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKSetPreferences() call TKQueryPreferences("Enable Hebrew ?\n", "g:TKenableHebrew") if g:TKenableHebrew let Msg = "Separate languages on separate lines?\n" call TKQueryPreferences(Msg, "g:TKseparateLang") endif let Msg = "Put section labels on a separate line?\n" call TKQueryPreferences(Msg, "g:TKlabelOnSepLine") let Msg = "Open viewers in detached sessions?\n" call TKQueryPreferences(Msg, "g:TKdetachedViewers") endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKSetDefaultProgNames() if !has ("win32") "UNIX let g:TKrmCmd = "\\rm" let g:TKcpCmd = "\\cp -p" let g:TKlatexProg = "elatex" " scrollmode is nice, but for some errors latex will prompt you for an "input, and in some you'll even have to use ^C to terminate it "let g:TKlatexProg = "elatex --interaction scrollmode" let g:TKdvi2psProg = "dvips" let g:TKps2pdfConv = "ps2pdf" let g:TKDVIviewer = "xdvi" let g:TKPSviewer = "ghostview" let g:TKPDFviewer = "acroread" "let g:TKviewerDetachedPre = "xterm -sb -e " let g:TKviewerDetachedPre = "xterm -sb -iconic -e " let g:TKviewerDetachedPost = " &" let g:TKDevNull = " /dev/null" else "Win32 let g:TKrmCmd = "del" let g:TKcpCmd = "copy" let g:TKlatexProg = "elatex" let g:TKdvi2psProg = "dvips" let g:TKps2pdfConv = "ps2pdf" let g:TKDVIviewer = "windvi" let g:TKPSviewer = "gsview32" let g:TKPDFviewer = "acrord32" let g:TKviewerDetachedPre = "start " let g:TKviewerDetachedPost = "" let g:TKDevNull = " :null" endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKSetProgNames() echo "\n NOTES: 1. You can set all preferences in your .vimrc file !! \n" echo "\n 2. Pressing ENTER will keep the current value " echo "\n (Shown as [current value] in each prompt) \n\n" " Set name of LaTeX program if ! exists("g:TKlatexProg") let g:TKlatexProg = "elatex" endif let InputPrompt= "\nEnter name of LaTeX program \[".g:TKlatexProg."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKlatexProg = EnteredValue endif " Set name of DVI to PS converter if ! exists("g:") let g:TKdvi2psProg = "dvips" endif let InputPrompt= "\nEnter name of DVI to PS converter \[".g:TKdvi2psProg."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKdvi2psProg = EnteredValue endif " Set name of PS to PDF converter if ! exists("g:TKps2pdfConv") let g:TKps2pdfConv = "ps2pdf" endif let InputPrompt= "\nEnter name of PS to PDF converter \[".g:TKps2pdfConv."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKps2pdfConv = EnteredValue endif " Set name of DVI viewer if ! exists("g:TKDVIviewer") if has ("win32") let g:TKDVIviewer = "windvi" else let g:TKDVIviewer = "xdvi" endif endif let InputPrompt= "\nEnter name of DVI viewer \[".g:TKDVIviewer."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKDVIviewer = EnteredValue endif " Set name of PS viewer if ! exists("g:TKPSviewer") if has ("win32") let g:TKPSviewer = "gsview32" else let g:TKPSviewer = "ghostview" endif endif let InputPrompt= "\nEnter name of postscript viewer \[".g:TKPSviewer."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKPSviewer = EnteredValue endif " Set name of PDF viewer if ! exists("g:TKPDFviewer") if has ("win32") let g:TKPDFviewer = "acrord32" else let g:TKPDFviewer = "acroread" endif endif let InputPrompt= "\nEnter name of PDF viewer \[".g:TKPDFviewer."\]\n" let EnteredValue= input(InputPrompt) if EnteredValue != "" let g:TKPDFviewer = EnteredValue endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKusageHelp() echo "\n Latex environment for GVIM [ Version 0.25 -- 1 March 1999 ]\n\n" echo " LaTeX only - runs LaTeX once. \n" echo " Run LaTeX once- runs LaTeX makeindex and BibTeX once. \n" echo " Make DVI file - runs LaTeX, makeindex and BibTeX enough times to \n" echo " solve references, citations etc.\n" echo " Make PS file - create postscript file from the dvi file, tries\n" echo " to create the DVI file if it's missing.\n" echo " Make PDF file - create PDF file from the postscript file, tries\n" echo " to create the PS file if it's missing.\n" echo " Set Main Tex file name - allows to set the name of the TeX file\n" echo " on which the following commands are executed.\n" echo " E.g. if you edit a file that is included by the\n" echo " main TeX file.\n" echo " View DVI file\n" echo " View PS file\n" echo " View PDF file - call the appropriate viewer.\n" echo " Set preferences- Set the names of the programs called (E.g. view\n" echo " PDF using ghostview or Acrobat reader)\n" echo " and other preferences.\n" echo " NOTE: applies to current session, for a permanenr\n" echo " change set it in the .vimrc file (see docs).\n" echo " Help - Show this help page.\n" echo " ispell this buffer- run ispell on the current buffer.\n" echo " (ispell should be available on the computer)\n" echo " Create New document- lets you create a skelaton for a new LaTeX" echo " document." echo " Load a template - lets you load a template you've prepared." echo " \n\n Tomer Kol\n\n" let RC = input("Press ENTER to continue") endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKSetTitle() if expand("%:e") == "tex" && exists("g:TeXfile") let &titlestring = "VIM@".hostname()." - Edited file: ".expand("%:~") let &titlestring = &titlestring ." Main TeX File: ".g:TeXfile" else let &titlestring = "VIM@".hostname()." - ".expand("%:~") endif endfunction "+-----------------------------------------------------+ "| | "| Setup the menus | "| add args? | "| where to put the latex menu, where to put the | "| language menu | "+-----------------------------------------------------+ function! TKsetDefaultMenu() " Make sure the '<' flag is not included in 'cpoptions', otherwise would " not be recognized. See ":help 'cpoptions'". let cpo_save = &cpo let &cpo = "" """""""""""""""""""""""""""""""""""""""""""""""" " Additions for Hebrew and LaTeX " """""""""""""""""""""""""""""""""""""""""""""""" "latex menu nmenu 50.303 &LaTeX.LaTex\ &only :wa:!elatex % imenu 50.303 &LaTeX.LaTex\ &only :wa:!elatex % nmenu 50.305 &LaTeX.Run\ &LaTex\ once :wa:call TKMakeDVIfile(1) imenu 50.305 &LaTeX.Run\ &LaTex\ once :wa:call TKMakeDVIfile(1) nmenu 50.310 &LaTeX.Make\ &DVI :wa:call TKMakeDVIfile() imenu 50.310 &LaTeX.Make\ &DVI :wa:call TKMakeDVIfile() nmenu 50.320 &LaTeX.Make\ PS :wa:call TKMakePSfile() imenu 50.320 &LaTeX.Make\ PS :wa:call TKMakePSfile() nmenu 50.330 &LaTeX.Make\ PDF :wa:call TKMakePDFfile() imenu 50.330 &LaTeX.Make\ PDF :wa:call TKMakePDFfile() amenu 50.340 &LaTeX.Set\ Main\ TeX\ file\ name :call TKSetTeXfileName(1) amenu 50.345 &LaTeX.-------------------- amenu 50.350 &LaTeX.&view\ DVI\ file :call TKLaunchDVIviewer() amenu 50.360 &LaTeX.view\ PS\ file :call TKLaunchPSviewer() amenu 50.370 &LaTeX.view\ PDF\ file :call TKLaunchPDFviewer() amenu 50.380 &LaTeX.--------------------- amenu 50.390 &LaTeX.Set\ Preferences.Programs\ names :call SetProgNames() amenu 50.390 &LaTeX.Set\ Preferences.Other\ preferences :call TKSetPreferences() amenu 50.395 &LaTeX.&Help :call TKusageHelp() amenu 50.400 &LaTeX.---------------------- if !has ("win32") nmenu 50.400 &LaTeX.ispell\ this\ buffer :w:!xterm -e ispell %:e % imenu 50.400 &LaTeX.ispell\ this\ buffer :w:!xterm -e ispell %:e % else nmenu 50.400 &LaTeX.ispell\ this\ buffer :w:!ispell %:e % imenu 50.400 &LaTeX.ispell\ this\ buffer :w:!ispell %:e % endif amenu 50.410 &LaTeX.====================== amenu 50.420 &LaTeX.Create\ New\ Document :call TKcreateLaTeXTemplate() amenu 50.430 &LaTeX.Load\ a\ template :call TKloadTemplate() "Hebrew menu "60amenu Language.Hebrew-English\ imenu 60.310 Language.Hebrew-EnglishF9 :set invrl:set invhk nmenu 60.310 Language.Hebrew-EnglishF9 :set invrl:set invhk let &cpo = cpo_save unlet cpo_save endfunction "+-----------------------------------------------------+ "| | "| key bindings mappings | "| | "+-----------------------------------------------------+ function! TKsetdefaultKeys() """"""""""""""""""""""""""""""""""""""" " LaTeX mode commands """"""""""""""""""""""""""""""""""""""" map :call TKinsertSec() imap :call TKinsertSec() map :call TKinsertSec() imap :call TKinsertSec() "insert latex env map :call TKinsertEnv() imap :call TKinsertEnv() "insert latex env protected in an English env map :call TKinsertEnv(1) imap :call TKinsertEnv(1) map :call TKinsertFloat() imap :call TKinsertFloat() map :call TKenterCmdWithText() imap :call TKenterCmdWithText() map :call TKotherLangInsert()i imap :call TKotherLangInsert()i map :call TKincludegraphics() imap :call TKincludegraphics() map :wa:call TKMakeDVIfile() imap :wa:call TKMakeDVIfile() map :wa:call TKMakeDVIfile(1) imap :wa:call TKMakeDVIfile(1) " insert \item on a new line map o\item imap o\item endfunction "################################################################# "+=====================================================+ "| | "| Functions for the support of editing LaTeX | "| | "+=====================================================+ "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKinsertSec() let ConfPrompt="Type of section to enter:" let ConfChoices="&Chapter\n&Section\nS&ubsection\nSu&bsubsection\n&Paragraph" let ConfChoices=ConfChoices."\nCANCEL" let choice = confirm(ConfPrompt, ConfChoices, 2) if choice == 1 let SecType = "chapter" elseif choice == 2 let SecType = "section" elseif choice == 3 let SecType = "subsection" elseif choice == 4 let SecType = "subsubsection" elseif choice == 5 let SecType = "paragraph" elseif choice == 6 return endif let SecName = input("name of ".SecType.": ") if g:TKenableHebrew && g:TKseparateLang && &rl let SecCommand = "\\".SecType."{%\n".SecName."%\n}" else let SecCommand = "\\".SecType."{".SecName."}" endif let Text = "%=====================\n" let Text = Text.SecCommand let LabelName = input("Enter label (just press for none): ") if LabelName != "" if g:TKlabelOnSepLine let Text = Text."\n\\label{".LabelName."}" else let Text = Text."\\label{".LabelName."}" endif endif exe "normal o".Text."\n\" endfunction "+-----------------------------------------------------+ "| optional parameter - place in an English environment| "+-----------------------------------------------------+ function! TKinsertEnv(...) let EnvName = input("name of Environment: ") " save current content let Text = "\\begin{".EnvName."}\n\n\\end{".EnvName."}" " if at beginning of line - start in current line. If not - open " a new line for the \begin{} if col(".") != 1 exe "normal o\" endif let LineAdj = "-1" if a:0 != 0 if a:1 && g:TKenableHebrew let Text = "\\begin{otherlanguage}{english}\n".Text let Text = Text."\n\\end{otherlanguage}" let LineAdj = "-2" "if we protect this in an English environment, we might " as well make sure we're in left-right mode exe "set norl" exe "set nohk" endif endif exe "normal i".Text."\" " move up exe LineAdj endfunction """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "+-----------------------------------------------------+ "| insert ref/cite/caption etc. | "| argument (optional) is the type of cmd | "+-----------------------------------------------------+ function! TKenterCmdWithText(...) if a:0 == 0 let LinkType = input("name of link (ref, label etc.): ") else let LinkType = a:1 endif let LinkLabel = input("label/text for the link: ") if g:TKenableHebrew && g:TKseparateLang && &rl if col(".") == 1 let Text = "\\".LinkType."{%\n".LinkLabel."%\n}%\n" else let Text = "%\n\\".LinkType."{%\n".LinkLabel."%\n}%\n" endif else let Text = "\\".LinkType."{".LinkLabel."}" endif exe "normal a".Text."\" endfunction """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKotherLangInsert() if &rl == 1 let InsertCmd = "\\L" else let InsertCmd = "\\R" endif if g:TKenableHebrew && g:TKseparateLang " if col(".") == 1 " let Text = InsertCmd."{%\n%\n}%\n" " else " let Text = "%\n".InsertCmd."{%\n%\n}%\n" " endif " exe "normal a".Text."\" " exe "-2" let Text = "\n".InsertCmd."{}" exe "normal a".Text."\" else let Text = InsertCmd."{}" exe "normal a".Text."\" endif exe "set invrl" exe "set invhk" endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKincludegraphics() "enlarge cmdheight let OrigCH = &ch let &ch = 4 let FileName = input("name of graphics file: ") echo "\nEnter parameters (scaling etc.) just press for none:\n" let &ch = OrigCH let Inputtext = "" let Params = input(Inputtext) if Params != "" let CmdText = "\\includegraphics[".Params."]{".FileName."}" else let CmdText = "\\includegraphics{".FileName."}" endif if g:TKenableHebrew let Text = "\\begin{otherlanguage}{english}\n ".CmdText let Text = Text."\n\\end{otherlanguage}\n" else let Text = CmdText."\n" endif exe "normal a".Text."\" endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKinsertFloat() "enlarge cmdheight let OrigCH = &ch let &ch = 6 let FloatName = input("name of float (figure, table ...): ") let CRforNone = "(press for none): " let FloatPlac = input("\nEnter placement ".CRforNone) let FloatCap = input("\nEnter caption ".CRforNone."\n") let FloatLabel = input("\nEnter label ".CRforNone."\n") if FloatPlac == "" let Text = "\\begin{".FloatName."}\n \n" else let Text = "\\begin{".FloatName."}[".FloatPlac."]\n \n" endif let LineAdj = "-2" if FloatCap != "" let Text = Text." \\caption{".FloatCap."}\n" let LineAdj = LineAdj - 1 endif if FloatLabel != "" let Text = Text." \\label{".FloatLabel."}\n" let LineAdj = LineAdj - 1 endif let Text = Text."\\end{".FloatName."}\n" " if at beginning of line - start in current line. If not - open " a new line for the \begin{} if col(".") != 1 exe "normal o\" endif exe "normal i".Text."\" " move up exe LineAdj let &ch = OrigCH endfunction "+-----------------------------------------------------+ "| TKloadTemplate() | "| | "| | "+-----------------------------------------------------+ function! TKloadTemplate() " exe "normal :so $VIM\\" if !exists("g:TKtemplatesDir") let Msg = "ERROR: \"TKtemplatesDir\" is not defined!!\n\n" let Msg = Msg."NOTE: You should set TKtemplatesDir in your vimrc file,\n" let Msg = Msg." e.g., by adding the line:\n" let Msg = Msg."let TKtemplatesDir=\"~/TeX/Templates/\"\non unix, or\n" let Msg = Msg."let TKtemplatesDir=\"C:\\\\TeX\\\\Templates\\\\\" \non windows" let Msg = Msg."\n\nI can try $VIM/Templates/" let RC = confirm(Msg, "Try it\n&Abort") if RC == 1 exe "browse confirm e $VIM/Templates/" else return endif else exe "browse confirm e ".g:TKtemplatesDir endif endfunction "+-----------------------------------------------------+ "| TKcreateLaTeXTemplate() | "| | "| | "+-----------------------------------------------------+ " TODO " add \maketitle et al " function! TKcreateLaTeXTemplate() let CurBufName = bufname("%") let FileName=input("\nEnter file name [".CurBufName."]: ") if FileName == "" if CurBufName != "" let FileName = CurBufName else echo "No file name was entered!!" return endif endif "if extension is not tex, add .tex if fnamemodify(FileName, ":e") != "tex" let FileName = FileName.".tex" endif if filereadable(FileName) let Msg = "The file \"".FileName."\" already exists.\nOverwrite?" let RC = confirm(Msg, "&Yes\n&Cancel", 2) if RC == 2 return endif endif exe "wa" exe "e! ".FileName exe "1,$d" if g:TKdefDocClass != "" let Msg = "Your default document class is: ".g:TKdefDocClass let Msg = Msg."\nWith the options: ".g:TKdefDocOpt let RC = confirm(Msg, "&Use it\n&Change it\n&Abort", 1) else RC = 2 endif if RC == 3 return 1 endif if RC == 1 let DocClass = g:TKdefDocClass let ClassArgs = g:TKdefDocOpt else let Msg = "\n What class of document would you like?\n" let Msg=Msg." E.g., article, report, book etc. " let DocClass = input(Msg) let Msg = "\nEnter class options separated by commas\n" let Msg=Msg." E.g., if you use A4 paper add \"a4paper\"\n" let Msg=Msg." to get larger font add \"11pt\" or \"12pt\"\n" let ClassArgs = input(Msg) endif let Msg = "Query about optional packages and features or just put everything?\n\n" let Msg = Msg."(i.e., graphicx, hyperref, index, table of contents and \n" let Msg = Msg."(only if TKenableHebrew is set) Hebrew (with hebrew as\n" let Msg = Msg." the default language)\n" let RC = confirm(Msg, "Put &everthing in\n&Let me choose\n&Abort", 2) if RC == 3 return 1 endif if RC == 2 let Msg = "Do you need the \"graphixs\" package?\n(needed to include" let Msg = Msg." eps figures, color text etc." let PkgGraphicx = confirm(Msg, "&Yes\n&No") let Msg = "Do you need the \"hyperref\" package?\n(needed to create" let Msg = Msg."hyperlink (e.g., for PDF output)" let PkgHyperref = confirm(Msg, "&Yes\n&No") " conditioned by the value of enable Hebrew if g:TKenableHebrew let Msg = "Will this document include Hebrew?" let PkgHebrew = confirm(Msg, "&Yes\n&No") if PkgHebrew == 1 let Msg = "What will be the main language?" let MainLangHeb = confirm(Msg, "&Hebrew\n&English") endif endif let Msg = "Will this document contain an index?" let PkgIdx = confirm(Msg, "&Yes\n&No") let Msg = "Would you like a table of contents?" let WantTOC = confirm(Msg, "&Yes\n&No") else let PkgGraphicx = 1 let PkgHyperref = 1 let PkgHebrew = g:TKenableHebrew let MainLangHeb = g:TKMainLangHebrew let PkgIdx = 1 let WantTOC = 1 endif "------------------------------------ " create the document's skeleton "------------------------------------ call TKinsertline("%+====================================+") call TKinsertline("%| Skeleton created by TKlatex |") call TKinsertline("%+====================================+") if ClassArgs == "" call TKinsertline("\\documentclass{".DocClass."}") else call TKinsertline("\\documentclass[".ClassArgs."]{".DocClass."}") endif call TKinsertline("%+----------------+") call TKinsertline("%| Packages |") call TKinsertline("%+----------------+") if PkgGraphicx == 1 call TKinsertline("\\usepackage{graphicx}") endif if PkgIdx == 1 call TKinsertline("\\usepackage{makeidx}") call TKinsertline("\\makeindex") endif if PkgHebrew == 1 if MainLangHeb == 1 call TKinsertline("\\usepackage[english,hebrew]{babel}") else call TKinsertline("\\usepackage[hebrew,english]{babel}") endif endif if PkgHyperref == 1 call TKinsertline("% Hyperref is configured for PS and PDF files.") call TKinsertline("% To get hyperlinked DVI remove the \"dvips\" option") call TKinsertline("% of hyperref") call TKinsertline("\\usepackage[dvips,colorlinks,breaklinks]{hyperref}") endif if PkgHebrew == 1 call TKinsertline("% TKfixes should be the last package") call TKinsertline("\\usepackage{TKfixes}") endif call TKinsertline("") call TKinsertline("") call TKinsertline("%+====================================+") call TKinsertline("%| Doc content !! |") call TKinsertline("%+====================================+") call TKinsertline("\\begin{document}") if WantTOC == 1 call TKinsertline("") call TKinsertline("\\tableofcontents") endif call TKinsertline("") call TKinsertline("") call TKinsertline("") if PkgIdx == 1 call TKinsertline("%next command includes the index") call TKinsertline("\\printindex") endif call TKinsertline("\\end{document}") call TKinsertline("") exe "-5" let Msg = "DONE.\nLook at the comments in the created file" let RC = confirm(Msg, "&Thanks") return 0 endfunction "+=====================================================+ "| | "| Functions for support of Hebrew LaTeX | "| | "+=====================================================+ "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKfixHebrewOUTfile(NameOfOUTfile) if filereadable(a:NameOfOUTfile) execute "normal :0split\:e ".a:NameOfOUTfile."\" call TKtranslateHebrewLetNames() write quit endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKfixHebrewIDXfile(NameOfIDXfile) if filereadable(a:NameOfIDXfile) execute "normal :0split\:e ".a:NameOfIDXfile."\" call TKtranslateHebrewLetNames() " remove \IeC execute "normal :1,$s/\\\\IeC[ ]//ge\" write quit endif endfunction "+-----------------------------------------------------+ "| | "+-----------------------------------------------------+ function! TKtranslateHebrewLetNames() exe "normal :1,$s/\\\\alef[ ]/à/ge \" exe "normal :1,$s/\\\\bet[ ]/á/ge \" exe "normal :1,$s/\\\\gimel[ ]/â/ge \" exe "normal :1,$s/\\\\dalet[ ]/ã/ge \" exe "normal :1,$s/\\\\he[ ]/ä/ge \" exe "normal :1,$s/\\\\vav[ ]/å/ge \" exe "normal :1,$s/\\\\zayin[ ]/æ/ge \" exe "normal :1,$s/\\\\het[ ]/ç/ge \" exe "normal :1,$s/\\\\tet[ ]/è/ge \" exe "normal :1,$s/\\\\yod[ ]/é/ge \" exe "normal :1,$s/\\\\finalkaf[ ]/ê/ge \" exe "normal :1,$s/\\\\kaf[ ]/ë/ge \" exe "normal :1,$s/\\\\lamed[ ]/ì/ge \" exe "normal :1,$s/\\\\finalmem[ ]/í/ge \" exe "normal :1,$s/\\\\mem[ ]/î/ge \" exe "normal :1,$s/\\\\finalnun[ ]/ï/ge \" exe "normal :1,$s/\\\\nun[ ]/ð/ge \" exe "normal :1,$s/\\\\samekh[ ]/ñ/ge \" exe "normal :1,$s/\\\\ayin[ ]/ò/ge \" exe "normal :1,$s/\\\\finalpe[ ]/ó/ge \" exe "normal :1,$s/\\\\pe[ ]/ô/ge \" exe "normal :1,$s/\\\\finaltsadi[ ]/õ/ge \" exe "normal :1,$s/\\\\tsadi[ ]/ö/ge \" exe "normal :1,$s/\\\\qof[ ]/÷/ge \" exe "normal :1,$s/\\\\resh[ ]/ø/ge \" exe "normal :1,$s/\\\\shin[ ]/ù/ge \" exe "normal :1,$s/\\\\tav[ ]/ú/ge \" exe "normal :1,$s/\\\\IeC[ ]//ge \" endfunction """""""""""""""""""""""""""""""""""""""""""""""""""""" "+=====================================================+ "| | "| Initialization | "| | "+=====================================================+ "Set title if !exists("TKtitleAU") let g:TKtitleAU = 1 auto BufEnter * call TKSetTitle() endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " 1-> enable Hebrew features if !exists("TKenableHebrew") let g:TKenableHebrew = 1 endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " 1-> Primary document's language is Hebrew if !exists("TKMainLangHebrew") let g:TKMainLangHebrew = 1 endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " 1 -> seperate hebrew and english in commands if !exists("TKseparateLang") let g:TKseparateLang = 1 endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " 1-> put \label{} of sections on a new line if !exists("TKlabelOnSepLine") let g:TKlabelOnSepLine = 1 endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " Start (DVI/PS/PDF) viewers detached if !exists("TKdetachedViewers") let g:TKdetachedViewers = 1 endif """""""""""""""""""""""""""""""""""""""""""""""""""""" " Default doc type if !exists("TKdefDocClass") let g:TKdefDocClass = "article" endif if !exists("TKdefDocOpt") let g:TKdefDocOpt = "a4paper,12pt" endif """""""""""""""""""""""""""""""""""""""""""""""""""""" call TKSetDefaultProgNames()