% File: latex.sl -*- mode: SLang; mode: fold -*- % % Author: Guido Gonzato, guido dot gonzato at univr dot it % % Description: a souped-up latex mode that aims at making LaTeX a % bit easier to use. % % Installation: copy latex.sl to $JED_ROOT/lib (back up the original file % latex.sl beforehand), then add these lines to your .jedrc: % % add_mode_for_extension ("latex", "tex"); % enable_dfa_syntax_for_mode ("LaTeX"); % % You'll also want to create the DFA cache table. Add % "latex.sl" to the list in the file preparse.sl, then % (as root) run the command: % % jed -batch -n -l preparse % % CAVEAT: this file is incompatible with folding mode, % due to clashing ^Cf key binding. See latex.hlp % for details. % % Version: 1.3.0 % % Last updated: 3 December 2002 % TODO: anything you will report to me. % ----- % custom variables % output profile: "dvi", "ps", "dvipdf", "pdf" custom_variable ("LaTeX_Default_Output", "dvi"); custom_variable ("LaTeX_Indent", 2); custom_variable ("LaTeX_Article_Default_Options", "a4paper,12pt"); custom_variable ("LaTeX_Book_Default_Options", "twoside,11pt"); custom_variable ("LaTeX_Letter_Default_Options", "a4paper,12pt"); custom_variable ("LaTeX_Report_Default_Options", "twoside,12pt"); custom_variable ("LaTeX_Slides_Default_Options", "a4paper,landscape"); custom_variable ("LaTeX_Prosper_Default_Options", "pdf,accumulate,slideColor,colorBG,azure"); custom_variable ("LaTeX_Default_Language", "english,italian"); % for Babel % DOS/Windows users: make sure helper programs are in the PATH #ifdef WIN32 custom_variable ("LaTeX_View_Dvi_Cmd", "yap"); custom_variable ("LaTeX_View_Ps_Cmd", "gsview32"); custom_variable ("LaTeX_View_Pdf_Cmd", "gsview32"); custom_variable ("LaTeX_Print_Cmd", "gsview32"); #else custom_variable ("LaTeX_View_Dvi_Cmd", "xdvi"); custom_variable ("LaTeX_View_Ps_Cmd", "gv -watch"); custom_variable ("LaTeX_View_Pdf_Cmd", "acroread"); custom_variable ("LaTeX_Print_Cmd", "lpr"); #endif static variable TRUE = 1; static variable FALSE = 0; static variable WARNING = -1; static variable NO_PUSH_SPOT = FALSE; static variable PUSH_SPOT = TRUE; static variable NO_POP_SPOT = FALSE; static variable POP_SPOT = TRUE; static variable ITEM_LABEL = FALSE; static variable USE_MASTER = FALSE; #ifdef UNIX static variable devnull = " >/dev/null 2>&1 &"; #else static variable devnull = " >NUL"; #endif static variable LaTeX_Compose_Cmd = "latex" + " -interaction=nonstopmode"; static variable LaTeX_Compose_Pdf_Cmd = "pdflatex" + " -interaction=nonstopmode"; static variable LaTeX_Dvips_Cmd = "dvips"; static variable LaTeX_Dvipdf_Cmd = "dvipdf"; static variable LaTeX_Bibtex_Cmd = "bibtex"; static variable LaTeX_Makeindex_Cmd = "makeindex"; static variable LaTeX_Buffer; % ----- %}}} % ----- % this function is sto^H^H^H borrowed from the original latex.sl %{{{ define tex_complete_symbol () { variable symbol, completion; variable insertbuf = whatbuf(), searchbuf = "*ltx-comp*"; !if (bufferp(searchbuf)) { sw2buf(searchbuf); insert_file( expand_jedlib_file("ltx-comp.dat") ); bob(); set_buffer_modified_flag(0); sw2buf(insertbuf); bury_buffer(searchbuf); } push_spot(); push_mark(); bskip_word(); symbol = bufsubstr(); setbuf(searchbuf); !if (bol_fsearch(sprintf("\\%s", symbol))) bob(); % wrap to start if (bol_fsearch(sprintf("\\%s", symbol))) { go_right_1 (); go_right(strlen(symbol)); push_mark_eol(); completion = bufsubstr(); } else { setbuf(insertbuf); pop_mark_0 (); pop_spot(); error("No completion found"); } setbuf(insertbuf); goto_spot (); push_mark(); !if (ffind_char (' ')) eol(); del_region(); insert(completion); pop_spot(); } %}}} % ----- % required stuff and variables %{{{ require ("texcom"); autoload ("latex_toggle_math_mode", "ltx-math"); autoload ("latex_insert_math", "ltx-math"); autoload ("latex_math_mode", "ltx-math"); WRAP_INDENTS = 1; % you really want this % very simple (but effective!) parsing mechanism of the LaTeX log %{{{ static variable LaTeX_Compile_Buffer = "*LaTeX log*", LaTeX_Dvips_Buffer = "*dvips log*", LaTeX_Bibtex_Buffer = "*bibtex log*", LaTeX_Makeindex_Buffer = "*makeindex log*", LaTeX_Xdvi_Buffer = "*xdvi log*", LaTeX_Xpdf_Buffer = "*xpdf log*", LaTeX_Gv_Buffer = "*gv log*", LaTeX_Tree_Buffer = "*LaTeX Tree*", line_mark; static define update_log_hook () { line_mark = create_line_mark (color_number ("menu_selection")); } define find_next_error () { variable found; found = fsearch ("! "); if (0 == found) found = fsearch ("l."); if (0 != found) eol (); else beep (); } define goto_error_line () { variable line, tmp = get_word_chars (); % extract the line number bol (); define_word ("0-9"); skip_word (); push_mark (); bskip_word (); line = integer (bufsubstr ()); sw2buf (LaTeX_Buffer); bob (); () = down (line - 1); define_word (tmp); } define close_latex_parse_errors () { setbuf_info (getbuf_info () & 0xFE); % not modified set_readonly (1); delbuf (whatbuf()); } define latex_parse_errors () { variable row = window_info ('r'), key = _Reserved_Key_Prefix + "'", ch = '*', err_mode = "LaTeX-Log"; !if (keymap_p (err_mode)) make_keymap (err_mode); use_keymap (err_mode); definekey ("find_next_error ()", key, err_mode); definekey ("close_latex_parse_errors ()", "q", err_mode); definekey ("goto_error_line ()", "g", err_mode); flush ("Error(s) found! Press 'L' to switch to the log."); ch = toupper (getkey ()); flush (""); if ('L' == ch) { pop2buf (LaTeX_Compile_Buffer); set_buffer_hook ("update_hook", &update_log_hook); set_readonly (1); % move to the first error bob (); find_next_error (); flush (key + ": next error; 'g': go to error line; 'q': quit"); } else % back to the LaTeX buffer sw2buf (LaTeX_Buffer); } % ----- define latex_compile_and_parse (cmd) { variable key, exitcode = TRUE, exit_status; LaTeX_Buffer = whatbuf (); sw2buf (LaTeX_Compile_Buffer); set_readonly (0); erase_buffer (); exit_status = run_shell_cmd (cmd); if (FALSE == exit_status) { % handle warnings bob (); if (0 != fsearch ("Font Warning")) { flush ("Font Warning."); beep (); usleep (1000); exitcode = WARNING; } % else if (0 != fsearch ("Rerun to get")) { flush ("Rerun to get cross-references right."); beep (); usleep (1000); exitcode = WARNING; } % else % after "Rerun to get" = no hope if (0 != fsearch ("There were undefined")) { flush ("There were undefined references."); beep (); exitcode = WARNING; } % any other? % else if (WARNING != exitcode) flush ("Success!"); sw2buf (LaTeX_Buffer); return exitcode; } else { latex_parse_errors (); return FALSE; } } % ----- %}}} % composing %{{{ public define latex_select_output () { variable default = LaTeX_Default_Output; LaTeX_Default_Output = read_with_completion ("dvi,ps,pdf,dvipdf", "LaTeX output: dvi,ps,pdf,dvipdf", default, "", 's'); } % ----- variable latex_file, latex_file_dir; public define latex_compose () { variable bat, dvi, cmd, cmd2, status; !if (USE_MASTER) (latex_file, latex_file_dir,,) = getbuf_info (); dvi = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".dvi"; bat = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".bat"; % TODO: FIX THE WINDOZE CASE!!! switch (LaTeX_Default_Output) { case "dvi": cmd = LaTeX_Compose_Cmd; cmd2 = ""; } { case "ps": cmd = LaTeX_Compose_Cmd; cmd2 = LaTeX_Dvips_Cmd; } { case "dvipdf": cmd = LaTeX_Compose_Cmd; cmd2 = LaTeX_Dvipdf_Cmd; } { case "pdf": cmd = LaTeX_Compose_Pdf_Cmd; cmd2 = ""; } % run latex or whatever save_buffers (); flush ("Composing... (output profile: " + LaTeX_Default_Output + ")"); #ifdef UNIX status = latex_compile_and_parse ("cd " + latex_file_dir + "; " + cmd + " " + dircat (latex_file_dir, latex_file)); #elifdef WIN32 % build a .bat file, then run it if (1 == file_status (bat)) delete_file (bat); write_string_to_file ("cd " + latex_file_dir + "\n", bat); append_string_to_file (cmd + " " + dircat (latex_file_dir, latex_file) + "\n", bat); status = latex_compile_and_parse (bat); % will be deleted later #endif if (FALSE == status) return; % if (WARNING == status) { % beep (); % usleep (2000); % } % if cmd2 isn't void, run dvips or whatever if (strlen(cmd2)) { flush ("Running: " + cmd2 + " " + dircat (latex_file_dir, dvi)); sw2buf (LaTeX_Dvips_Buffer); set_readonly (0); erase_buffer (); #ifdef UNIX % cd to the source directory, so that included files can be found if (0 != run_shell_cmd ("cd " + latex_file_dir + "; " + cmd2 + " " + dvi + " 2>&1")) #elifdef WIN32 delete_file (bat); write_string_to_file ("cd " + latex_file_dir + "\n", bat); append_string_to_file (cmd2 + " " + dvi + "\n", bat); if (0 != run_shell_cmd (bat)) #endif error ("Could not run " + cmd2+ " " + dircat (latex_file_dir, latex_file)); flush ("Done."); sw2buf (LaTeX_Buffer); } } %}}} % viewing, printing, etc. %{{{ % ----- define latex_master_file () { variable mf = read_mini ("Set this buffer as master file (y/n)?", "n", ""); if ( (mf [0] == 'y') or (mf [0] == 'Y') ) { USE_MASTER = TRUE; (latex_file, latex_file_dir,,) = getbuf_info (); } else USE_MASTER = FALSE; } public define latex_view () { variable dvi, ps, pdf; !if (USE_MASTER) (latex_file, latex_file_dir,,) = getbuf_info (); dvi = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".dvi"; ps = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".ps"; pdf = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".pdf"; switch (LaTeX_Default_Output) { case "dvi": if (1 != file_status (dvi)) error ("No file " + dvi); flush ("Running: " + LaTeX_View_Dvi_Cmd + " " + dvi + " (building fonts...)"); sw2buf (LaTeX_Xdvi_Buffer); set_readonly (0); erase_buffer (); #ifdef UNIX if (0 != run_shell_cmd ("cd " + latex_file_dir + "; " + LaTeX_View_Dvi_Cmd + " " + dvi + devnull)) #elifdef WIN32 if (0 != run_shell_cmd (LaTeX_View_Dvi_Cmd + " " + dvi)) #endif error ("Could not run " + LaTeX_View_Dvi_Cmd + " " + dvi); sw2buf (LaTeX_Buffer); } { case "ps": if (1 != file_status (dvi)) error ("No file " + dvi); flush ("Running: " + LaTeX_View_Ps_Cmd + " " + ps); sw2buf (LaTeX_Gv_Buffer); set_readonly (0); erase_buffer (); if (0 != run_shell_cmd (LaTeX_View_Ps_Cmd + " " + ps + devnull)) error ("Could not run " + LaTeX_View_Ps_Cmd + " " + ps); sw2buf (LaTeX_Buffer); } { case "dvipdf" or case "pdf": if (1 != file_status (pdf)) error ("No file " + pdf); flush ("Running: " + LaTeX_View_Pdf_Cmd + " " + pdf); sw2buf (LaTeX_Xpdf_Buffer); set_readonly (0); erase_buffer (); if (0 != run_shell_cmd (LaTeX_View_Pdf_Cmd + " " + pdf + devnull)) error ("Could not run " + LaTeX_View_Pdf_Cmd + " " + pdf); sw2buf (LaTeX_Buffer); } } % ----- public define latex_psprint () { variable cmd, ps; !if (USE_MASTER) (latex_file, latex_file_dir,,) = getbuf_info (); ps = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".ps"; if (1 != file_status (ps)) error ("No file " + ps + " to print!"); cmd = LaTeX_Print_Cmd + " " + ps; cmd = read_mini ("Print command:", "", cmd); () = run_shell_cmd (cmd + devnull); flush ("Done (printing)."); } % ----- public define latex_bibtex () { variable bib; !if (USE_MASTER) (latex_file, latex_file_dir,,) = getbuf_info (); bib = path_sans_extname (dircat (latex_file_dir, latex_file)); flush ("BibTeX'ing " + bib); sw2buf (LaTeX_Bibtex_Buffer); if (0 != run_shell_cmd (LaTeX_Bibtex_Cmd + " " + bib)) error ("Error bibTeX'ing " + bib + "!"); sw2buf (LaTeX_Buffer); flush ("Done."); } % ----- public define latex_makeindex () { variable idx; !if (USE_MASTER) (latex_file, latex_file_dir,,) = getbuf_info (); idx = path_sans_extname (dircat (latex_file_dir, latex_file)) + ".idx"; flush ("Processing the index..."); sw2buf (LaTeX_Makeindex_Buffer); if (0 != run_shell_cmd (LaTeX_Makeindex_Cmd + " " + idx)) error ("Error processing " + idx + "!"); sw2buf (LaTeX_Buffer); flush ("Done."); } % ----- define latex_mode_help () { variable file = expand_jedlib_file ("latex.hlp"); () = read_file (file); pop2buf (whatbuf ()); most_mode (); call ("one_window"); set_readonly (1); } %}}} % some utility functions %{{{ % this function is used to make indented environments static define latex_insert_pair_around_lines (left, right) { variable col; check_region (1); % spot pushed narrow (); bob (); col = what_column () - 1; insert (left); insert_spaces (col); do { insert_spaces (LaTeX_Indent); bol (); } while (down (1)); eob (); insert ("\n"); insert_spaces (col); insert (right); widen (); pop_spot (); } static define latex_insert_pair_around_region (left, right) { exchange_point_and_mark (); insert (left); exchange_point_and_mark (); insert (right); pop_spot (); pop_mark_0 (); } define latex_insert_tags (tag1, tag2, do_push_spot, do_pop_spot) { % if the current position is within a word, then select it if ( (0 == markp ()) and % no region defined (0 == string_match (" \t\\\n", char (what_char ()), 1)) ) { % ok, the cursor isn't on a space () = right (1); bskip_word (); push_mark (); skip_word (); } % if a region is defined, insert the tags around it if (markp () ) { latex_insert_pair_around_region (tag1, tag2); return; } % the remaining cases insert (tag1); if (do_push_spot) push_spot (); insert (tag2); if (do_pop_spot) pop_spot (); } % ----- define latex_begin_end (param1, param2, do_push_spot, do_pop_spot) { variable col = what_column () - 1; variable env1, env2; env1 = sprintf ("\\begin{%s}%s\n", param1, param2); env2 = sprintf ("\\end{%s}", param1); if (markp () ) { latex_insert_pair_around_lines (env1, env2); return; } insert (env1); insert_spaces (col + LaTeX_Indent); if (do_push_spot) push_spot (); insert ("\n"); insert_spaces (col); insert (env2); if (do_pop_spot) pop_spot (); } % ----- define latex_cmd (cmd, do_push_spot) { variable tmp; tmp = sprintf ("\\%s{", cmd); latex_insert_tags (tmp, "}", do_push_spot, do_push_spot); } % ----- static define latex_cmd_with_arg (cmd, arg, do_push_spot) { variable tmp, strarg; !if (strlen (arg)) strarg = ""; else strarg = "{" + arg; tmp = sprintf ("\\%s%s", cmd, strarg); if (markp () ) { latex_insert_pair_around_region (tmp, "}"); return; } insert (tmp); if (do_push_spot) push_spot (); !if (strlen (arg)) insert ("}"); if (do_push_spot) pop_spot (); } % ----- define latex_insert (cmd) { vinsert ("\\%s ", cmd); } define latex_insert_nospace (cmd) { vinsert ("\\%s", cmd); } define latex_insert_newline (cmd) { vinsert ("\\%s\n", cmd); } define latex_open_env () { variable env = read_mini ("What environment?", "", ""); vinsert ("\\begin{%s}\n", env); insert_spaces (LaTeX_Indent); } define latex_close_env () { variable tmp; insert ("\n"); push_spot (); if (bsearch ("\\begin{")) { () = right (7); push_mark (); skip_chars ("A-Za-z0-9"); tmp = bufsubstr (); pop_mark_0 (); pop_spot (); if (what_column () > 2) { call ("backward_delete_char"); call ("backward_delete_char"); } insert ("\\end{" + tmp + "}\n"); } else pop_spot (); } % ----- %}}} % Templates %{{{ define latex_article () { vinsert ("\\documentclass[%s]{article}\n\n", LaTeX_Article_Default_Options); insert ("\\begin{document}\n\n"); insert ("\\title{"); push_spot (); insert ("}\n\n"); insert ("\\author{}\n\n"); insert ("\\date{}\n\n"); insert ("\\maketitle\n\n"); insert ("\\begin{abstract}\n"); insert ("\\end{abstract}\n\n"); insert ("\\tableofcontents\n"); insert ("\\listoftables\n"); insert ("\\listoffigures\n\n"); insert ("\\section{}\n\n"); insert ("\\end{document}"); pop_spot (); } define latex_book () { vinsert ("\\documentclass[%s]{book}\n\n", LaTeX_Book_Default_Options); insert ("\\begin{document}\n\n"); insert ("\\frontmatter\n"); insert ("\\title{"); push_spot (); insert ("}\n\n"); insert ("\\author{}\n\n"); insert ("\\date{}\n\n"); insert ("\\maketitle\n\n"); insert ("\\tableofcontents\n"); insert ("\\listoftables\n"); insert ("\\listoffigures\n\n"); insert ("\\mainmatter\n\n"); insert ("\\part{}\n\n"); insert ("\\chapter{}\n\n"); insert ("\\section{}\n\n"); insert ("\\end{document}"); pop_spot (); } define latex_letter () { vinsert ("\\documentclass[%s]{letter}\n\n", LaTeX_Letter_Default_Options); insert ("\\begin{document}\n\n"); insert ("\\address\n{\n% return address\n}\n"); insert ("\\signature{"); push_spot (); insert ("}\n"); insert ("\\begin{letter}\n{\n% recipient's address\n}\n"); insert ("\\opening{}\n\n"); insert ("\\closing{}\n"); insert ("\\ps{}\n"); insert ("\\cc{}\n"); insert ("\\encl{}\n"); insert ("\\end{letter}\n"); insert ("\\end{document}\n"); pop_spot (); } define latex_report () { vinsert ("\\documentclass[%s]{report}\n\n", LaTeX_Report_Default_Options); insert ("\\begin{document}\n\n"); insert ("\\title{}\n"); push_spot (); insert ("\\author{}\n\n"); insert ("\\date{}\n\n"); insert ("\\maketitle\n\n"); insert ("\\begin{abstract}\n"); insert ("\\end{abstract}\n\n"); insert ("\\tableofcontents\n"); insert ("\\listoftables\n"); insert ("\\listoffigures\n\n"); insert ("\\part{}\n\n"); insert ("\\chapter{}\n\n"); insert ("\\section{}\n\n"); insert ("\\end{document}"); pop_spot (); } define latex_slides () { vinsert ("\\documentclass[%s]{slides}\n\n", LaTeX_Slides_Default_Options); insert ("\\begin{document}\n\n"); insert ("\\title{"); push_spot (); insert ("\\author{}\n\n"); insert ("\\date{}\n\n"); insert ("\\maketitle\n\n"); insert ("\\begin{abstract}\n"); insert ("\\end{abstract}\n\n"); insert ("}\n\n"); insert ("\\section{}\n\n"); insert ("\\end{document}"); pop_spot (); } % non standard but very useful... define latex_notice () { vinsert ("\\documentclass[%s]{article}\n\n", LaTeX_Article_Default_Options); insert ("\\usepackage{type1cm}\n"); insert ("\\usepackage{times}\n"); insert ("\\usepackage{color}\n"); insert ("\\usepackage{rotating}\n"); insert ("\\pagestyle{empty}\n"); insert ("\\begin{document}\n\n"); insert ("\\begin{sidewaysfigure}\n"); push_spot (); insert (" \\fontsize{2.5cm}{2.5cm}\\selectfont\n"); insert (" \\centerline{\\textcolor{blue}{\\textbf{Please:}}}\n"); insert (" \\vskip 1cm\n\n"); insert (" \\fontsize{4cm}{3cm}\\selectfont\n"); insert (" \\centerline{\\textcolor{red}{DO NOT}}\n"); insert (" \\centerline{\\textcolor{red}{SMOKE}}\n"); insert (" \\centerline{\\textcolor{red}{HERE!}}\n"); insert (" \\vskip 1cm\n\n"); insert (" \\fontsize{2cm}{2cm}\\selectfont\n"); insert (" \\centerline{\\textcolor{magenta}{If you do,}}\n"); insert (" \\centerline{\\textcolor{magenta}" + "{you'll be \\emph{deboned!}}}\n"); insert ("\\end{sidewaysfigure}\n"); insert ("\\end{document}"); pop_spot (); } % not standard too, but just too good to be true! define latex_prosper () { vinsert ("\\documentclass[%s]{prosper}\n", LaTeX_Prosper_Default_Options); insert ("% styles: azure,lignesbleues,contemporain," + "nuancegris,troispoints,frames\n\n"); insert ("\\hypersetup{pdfpagemode=FullScreen}\n\n"); insert ("\\title{"); push_spot (); insert ("}\n"); insert ("\\subtitle{}\n"); insert ("\\author{}\n"); insert ("\\institution{}\n"); insert ("\\slideCaption{}\n"); insert ("% \\Logo{\\includegraphics[scale=0.5]{logo.eps}}\n"); insert ("\\DefaultTransition{Glitter}\n"); insert ("% transitions: split,blinds,box,wipe,dissolve,glitter,replace\n\n"); insert ("\\begin{document}\n\n"); insert ("\\maketitle\n\n"); insert ("\\begin{slide}[Split]{slide 1 title}\n"); insert (" material for slide 1\n"); insert ("\\end{slide}\n%\n"); insert ("\\overlays{2}{\n"); insert ("\\begin{slide}[Box]{Overlay}\n"); insert (" overlay, part 1\\\\\n"); insert (" \\onlySlide{2}{\n"); insert (" overlay, part 2\n"); insert (" } % onlySlide\n"); insert ("\\end{slide}\n"); insert ("} % overlays\n"); insert ("\\overlays{3}{\n"); insert ("\\begin{slide}[Wipe]{Overlay + itemstep}\n"); insert (" \\begin{itemstep}\n"); insert (" \\item one\n"); insert (" \\item two\n"); insert (" \\item three\n"); insert (" \\end{itemstep}\n"); insert ("\\end{slide}\n"); insert ("} % overlays\n\n"); insert ("\\end{document}"); pop_spot (); } %}}} % Environments %{{{ define latex_insert_package (msg) { variable spot, tmp; % look for the appropriate package push_spot (); bob (); spot = fsearch (sprintf ("\\usepackage{%s}", msg)); if (0 == spot) { % not found () = fsearch ("\\documentclass"); eol (); vinsert ("\n\\usepackage{%s}", msg); flush (sprintf ("Note: \\usepackage{%s} inserted.", msg)); } pop_spot (); } define latex_env_item () { variable tmp; if (1 == ITEM_LABEL) tmp = "item []"; else tmp = "item"; latex_insert (tmp); } define latex_env_description () { latex_begin_end ("description", "", PUSH_SPOT, POP_SPOT); ITEM_LABEL = TRUE; } define latex_env_figure () { variable col = what_column () - 1; insert ("\\begin{figure}[htbp]\n"); insert_spaces (col + LaTeX_Indent); push_spot (); insert ("\\includegraphics[scale=|width=|height=]{file.eps}\n"); insert_spaces (col + LaTeX_Indent); insert ("\\caption{}\n"); insert_spaces (col + LaTeX_Indent); insert ("\\label{}\n"); insert_spaces (col); insert ("\\end{figure}"); latex_insert_package ("graphicx"); pop_spot (); } define latex_env_itemize () { variable col = what_column () - 1; ITEM_LABEL = FALSE; insert ("\\begin{itemize}\n"); insert_spaces (col + LaTeX_Indent); latex_env_item (); push_spot (); insert ("\n"); insert_spaces (col); insert ("\\end{itemize}\n"); pop_spot (); } define latex_env_picture () { latex_begin_end ("picture", "(width,height)(x offset,y offset)", PUSH_SPOT, POP_SPOT); } define latex_env_custom () { variable custom = read_mini ("What environment?", Null_String, ""); latex_begin_end (custom, "", PUSH_SPOT, POP_SPOT); } % tables static variable table_columns = 3; define latex_table_row (do_push_spot) { variable i, col; col = what_column () - 1; if (do_push_spot) push_spot (); loop (table_columns - 1) { insert (" &"); } insert (" \\\\"); if (do_push_spot) pop_spot (); } define is_integer (str) { if (Integer_Type == _slang_guess_type (str)) return (integer (str)); else return -1; } define latex_table_template (flag_tabular) { variable col = what_column () - 1; variable i, align, table_col_str, ok; do { table_col_str = read_mini ("Columns?", Null_String, "4"); table_columns = is_integer (table_col_str); if (-1 == table_columns) { ok = FALSE; beep (); message ("Wrong value! "); } else ok = TRUE; } while (FALSE == ok); align = "{|"; loop (table_columns) align = align + "l|"; align = align + "}"; !if (flag_tabular) { insert ("\\begin{table}[htbp]\n"); insert_spaces (col + LaTeX_Indent); } vinsert ("\\begin{tabular}%s\n", align); insert_spaces (col + LaTeX_Indent); insert ("\\hline\n"); insert_spaces (col + LaTeX_Indent); push_spot (); latex_table_row (NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + LaTeX_Indent); insert ("\\hline\n"); if (flag_tabular) insert ("\\end{tabular}\n"); else { insert_spaces (col + LaTeX_Indent); insert ("\\end{tabular}\n"); insert_spaces (col + LaTeX_Indent); latex_cmd ("caption", NO_PUSH_SPOT); insert ("\n"); insert_spaces (col + LaTeX_Indent); latex_cmd ("label", NO_PUSH_SPOT); insert ("\n"); insert_spaces (col); insert ("\\end{table}"); } pop_spot (); } %}}} % Paragraph %{{{ define latex_par_frame () { variable str; str = "\\begin{boxedminipage}[c]{\\linewidth}\n"; latex_insert_tags (str, "\\end{boxedminipage}\n", PUSH_SPOT, POP_SPOT); latex_insert_package ("boxedminipage"); } define latex_par_bgcolour () { variable str; variable colour = read_mini ("What colour?", Null_String, ""); str = sprintf ("\\colorbox{%s}{\\begin{minipage}{\\linewidth}", colour); latex_insert_tags (str, "\\end{minipage}}\n", PUSH_SPOT, POP_SPOT); latex_insert_package ("color"); } define latex_par_fgcolour () { variable str; variable colour = read_mini ("What colour?", Null_String, ""); str = sprintf ("\\textcolor{%s}{", colour); latex_insert_tags (str, "}", PUSH_SPOT, POP_SPOT); latex_insert_package ("color"); } define latex_includegraphics () { latex_cmd ("includegraphics[scale=|width=|height=]", PUSH_SPOT); latex_insert_package ("graphicx"); } % misc define latex_insert_braces () { insert ("{}"); go_left_1 (); } define latex_insert_dollar () { insert ("$$"); go_left_1 (); } define latex_greek_letter () { variable tmp = expand_keystring (_Reserved_Key_Prefix); flush (sprintf ("Press %sm + letter (e.g. %sma = \\alpha)", tmp, tmp)); } define latex_url () { latex_insert_tags ("\\url{", "}", PUSH_SPOT, POP_SPOT); latex_insert_package ("url"); } % let's finish % this function is for the Template/Packages menu define latex_babel () { variable tmp = sprintf ("\\usepackage[%s]{babel}\n", LaTeX_Default_Language); insert (tmp); } define latex_makeidx () { push_spot (); bob (); if (0 == fsearch ("\\documentclass")) { error ("No \\documentclass definition yet."); return; } () = down (1); insert ("\\usepackage{makeidx}\n"); if (0 == fsearch ("\\begin{document}")) { error ("No \\begin{document} definition yet."); return; } insert ("\\makeindex\n\n"); eob (); if (0 == bsearch ("\\end{document}")) { error ("No \\end{document} definition yet."); return; } insert ("\\printindex\n\n"); pop_spot (); } %}}} % Document outline %{{{ % ----- static define getline () { variable line, numline; push_mark (); eol (); line = bufsubstr (); pop_mark_0 (); numline = what_line (); return (line, numline); } % this one creates the buffer that contains the % document tree (outline) define latex_build_doc_tree () { variable i, found, line, numline, num_sections = 0, level = -1; variable sections = String_Type [7]; LaTeX_Buffer = whatbuf (); sw2buf (LaTeX_Tree_Buffer); set_readonly (0); erase_buffer (); insert ("Document outline ('q' to quit, or double click to select):\n\n"); sw2buf (LaTeX_Buffer); push_spot (); bob (); % let's start with \begin{document} if (0 == fsearch ("\\begin{document}")) error ("No \\begin{document} found!"); % get the line (line, numline) = getline (); sw2buf (LaTeX_Tree_Buffer); % TODO: find a better solution vinsert ("%6d%s", numline, " "); insert (line + "\n"); sections [0] = "\\part"; sections [1] = "\\chapter"; sections [2] = "\\section"; sections [3] = "\\subsection"; sections [4] = "\\subsubsection"; sections [5] = "\\paragraph"; sections [6] = "\\subparagraph"; % now, let's look for sectioning commands. % The algorithm is horrible, but it works. for (i = 0; i < 7; i++) { sw2buf (LaTeX_Buffer); bob (); do { found = FALSE; sw2buf (LaTeX_Buffer); if (0 != fsearch (sections [i])) { if (-1 == level) level = i; % first level of indentation % TODO: check for comments!!! (line, numline) = getline (); num_sections++; () = down (1); % skip sw2buf (LaTeX_Tree_Buffer); vinsert ("%6d%s", numline, " "); insert_spaces ((i - level + 1) * LaTeX_Indent); insert (line + "\n"); found = TRUE; } } while (TRUE == found); } % ok, now the tree is done; let's sort it sw2buf (LaTeX_Tree_Buffer); bob (); () = down (2); push_mark (); () = down (num_sections); eol (); sort (); pop_mark_0 (); set_readonly (1); latex_mode (); setbuf_info (getbuf_info () & 0xFE); % not modified sw2buf (LaTeX_Buffer); pop_spot (); } static define update_tree_hook () { line_mark = create_line_mark (color_number ("menu_selection")); } define latex_browse_tree () { variable tmode = "tree"; !if (keymap_p (tmode)) make_keymap (tmode); definekey ("delbuf (whatbuf())", "q", tmode); definekey ("goto_error_line", "\r", tmode); latex_build_doc_tree (); sw2buf (LaTeX_Tree_Buffer); set_buffer_hook ("update_hook", &update_tree_hook); set_readonly (1); use_keymap (tmode); set_mode (tmode, 0); set_buffer_hook ("mouse_2click", "goto_error_line"); } %}}} % The Menu %{{{ % ----- define init_menu (menu) { variable tmp; % templates menu_append_popup (menu, "&Templates"); $1 = sprintf ("%s.&Templates", menu); menu_append_item ($1, "&article", "latex_article"); menu_append_item ($1, "&book", "latex_book"); menu_append_item ($1, "&letter", "latex_letter"); menu_append_item ($1, "&report", "latex_report"); menu_append_item ($1, "&slides", "latex_slides"); menu_append_item ($1, "pr&osper", "latex_prosper"); menu_append_item ($1, "¬ice", "latex_notice"); % templates/packages % these aren't bound to any key menu_append_popup ($1, "&Packages"); $1 = sprintf ("%s.&Templates.&Packages", menu); menu_append_item ($1, "&babel", "latex_babel"); menu_append_item ($1, "&color", "latex_insert_newline (\"usepackage\{color\}\")"); tmp = "latex_insert_newline (\"usepackage\{epic\}\");"; tmp = tmp + "latex_insert_newline (\"usepackage\{eepic\}\")"; menu_append_item ($1, "&eepic", tmp); menu_append_item ($1, "&fancyvrb", "latex_insert_newline (\"usepackage\{fancyvrb\}\")"); tmp = "latex_insert_newline (\"usepackage\{fancyhdr\}\");"; tmp = tmp + "latex_insert_newline (\"pagestyle\{fancy\}\")"; menu_append_item ($1, "fancy&hdr", tmp); menu_append_item ($1, "&graphicx", "latex_insert_newline (\"usepackage\{graphicx\}\")"); menu_append_item ($1, "h&yperref", "latex_insert_newline (\"usepackage" + "[colorlinks,urlcolor=blue]\{hyperref\}\")"); menu_append_item ($1, "&isolatin1", "latex_insert_newline (\"usepackage\{isolatin1\}\")"); menu_append_item ($1, "&moreverb", "latex_insert_newline (\"usepackage\{moreverb\}\")"); menu_append_item ($1, "makeid&x", "latex_makeidx"); menu_append_item ($1, "&psfrag", "latex_insert_newline (\"usepackage\{psfrag\}\")"); menu_append_item ($1, "&rotating", "latex_insert_newline (\"usepackage\{rotating\}\")"); menu_append_item ($1, "&url", "latex_insert_newline (\"usepackage\{url\}\")"); % environments menu_append_popup (menu, "&Environments"); $1 = sprintf ("%s.&Environments", menu); menu_append_item ($1, "&array", "latex_begin_end (\"array\", \"{ll}\", 1, 1)"); menu_append_item ($1, "¢er", "latex_begin_end (\"center\", \"\", 1, 1)"); menu_append_item ($1, "&description", "latex_begin_end (\"description\", \"\", 1, 1)"); menu_append_item ($1, "displaymat&h", "latex_begin_end (\"displaymath\", \"\", 1, 1)"); menu_append_item ($1, "&enumerate", "latex_begin_end (\"enumerate\", \"\", 1, 1)"); menu_append_item ($1, "eq&narray", "latex_begin_end (\"eqnarray\", \"\", 1, 1)"); menu_append_item ($1, "e&quation", "latex_begin_end (\"equation\", \"\", 1, 1)"); menu_append_item ($1, "&figure", "latex_env_figure ()"); menu_append_item ($1, "flush&left", "latex_begin_end (\"flushleft\", \"\", 1, 1)"); menu_append_item ($1, "flush&Right", "latex_begin_end (\"flushright\", \"\", 1, 1)"); menu_append_item ($1, "&Itemize", "latex_env_itemize"); menu_append_item ($1, "\\&item", "latex_env_item"); % menu_append_item ($1, "&Letter", "latex_env_letter ()"); menu_append_item ($1, "&List", "latex_begin_end (\"list\", \"\", 1, 1)"); menu_append_item ($1, "&minipage", "latex_begin_end (\"minipage\", \"[c]{\\\\linewidth}\", 1, 1)"); menu_append_item ($1, "&picture", "latex_begin_end (\"picture\", \"\", 1, 1)"); menu_append_item ($1, "quotation", "latex_begin_end (\"quotation\", \"\", 1, 1)"); menu_append_item ($1, "qu&ote", "latex_begin_end (\"quote\", \"\", 1, 1)"); menu_append_item ($1, "ta&bbing", "latex_begin_end (\"tabbing\", \"\", 1, 1)"); menu_append_item ($1, "&table", "latex_table_template (0)"); menu_append_item ($1, "table &row", "latex_table_row (1)"); menu_append_item ($1, "tab&ular", "latex_table_template (1)"); menu_append_item ($1, "thebibliograph&y", "latex_begin_end (\"thebibliography\", \"{99}\", 1, 1)"); menu_append_item ($1, "t&Heorem", "latex_begin_end (\"theorem\", \"\", 1, 1)"); menu_append_item ($1, "titlepa&ge", "latex_begin_end (\"titlepage\", \"\", 1, 1)"); menu_append_item ($1, "&verbatim", "latex_begin_end (\"verbatim\", \"\", 1, 1)"); menu_append_item ($1, "ver&se", "latex_begin_end (\"verse\", \"\", 1, 1)"); menu_append_item ($1, "&Custom...", "latex_env_custom"); % font menu_append_popup (menu, "&Font"); $1 = sprintf ("%s.&Font", menu); menu_append_item ($1, "\\text&rm", "latex_cmd (\"textrm\", 1)"); menu_append_item ($1, "\\text&it", "latex_cmd (\"textit\", 1)"); menu_append_item ($1, "\\&emph", "latex_cmd (\"emph\", 1)"); menu_append_item ($1, "\\text&md", "latex_cmd (\"textmd\", 1)"); menu_append_item ($1, "\\text&bf", "latex_cmd (\"textmd\", 1)"); menu_append_item ($1, "\\text&up", "latex_cmd (\"textup\", 1)"); menu_append_item ($1, "\\text&sl", "latex_cmd (\"textsl\", 1)"); menu_append_item ($1, "\\texts&f", "latex_cmd (\"textsf\", 1)"); menu_append_item ($1, "\\texts&c", "latex_cmd (\"textsc\", 1)"); menu_append_item ($1, "\\text&tt", "latex_cmd (\"texttt\", 1)"); menu_append_item ($1, "\\&verb", "latex_insert_tags (\"\\\\verb|\", \"|\", 1, 1)"); menu_append_item ($1, "\\text&normal", "latex_cmd (\"textnormal\", 1)"); % Font popups: % font/size, font/environment, font/math menu_append_popup ($1, "&Size"); menu_append_popup ($1, "As &Environment"); menu_append_popup ($1, "&Math"); $1 = sprintf ("%s.&Font.&Size", menu); menu_append_item ($1, "\\&tiny", "latex_cmd (\"tiny\", 1)"); menu_append_item ($1, "\\s&criptsize", "latex_cmd (\"scriptsize\", 1)"); menu_append_item ($1, "\\&footnotesize", "latex_cmd (\"footnotesize\", 1)"); menu_append_item ($1, "\\&small", "latex_cmd (\"small\", 1)"); menu_append_item ($1, "\\&normalsize", "latex_cmd (\"normalsize\", 1)"); menu_append_item ($1, "\\&large", "latex_cmd (\"large\", 1)"); menu_append_item ($1, "\\&Large", "latex_cmd (\"Large\", 1)"); menu_append_item ($1, "\\L&ARGE", "latex_cmd (\"LARGE\", 1)"); menu_append_item ($1, "\\&huge", "latex_cmd (\"huge\", 1)"); menu_append_item ($1, "\\&Huge", "latex_cmd (\"Huge\", 1)"); % font/environment $1 = sprintf ("%s.&Font.As &Environment", menu); menu_append_item ($1, "&rmfamily", "latex_begin_end (\"rmfamily\", \"\", 1, 1)"); menu_append_item ($1, "&itshape", "latex_begin_end (\"itshape\", \"\", 1, 1)"); menu_append_item ($1, "&mdseries", "latex_begin_end (\"mdseries\", \"\", 1, 1)"); menu_append_item ($1, "&bfseries", "latex_begin_end (\"bfseries\", \"\", 1, 1)"); menu_append_item ($1, "&upshape", "latex_begin_end (\"upshape\", \"\", 1, 1)"); menu_append_item ($1, "&slshape", "latex_begin_end (\"slshape\", \"\", 1, 1)"); menu_append_item ($1, "s&ffamily", "latex_begin_end (\"sffamily\", \"\", 1, 1)"); menu_append_item ($1, "s&cshape", "latex_begin_end (\"scshape\", \"\", 1, 1)"); menu_append_item ($1, "&ttfamily", "latex_begin_end (\"ttfamily\", \"\", 1, 1)"); menu_append_item ($1, "&normalfont", "latex_begin_end (\"normalfont\", \"\", 1, 1)"); % font/math $1 = sprintf ("%s.&Font.&Math", menu); menu_append_item ($1, "\\mathr&m", "latex_cmd (\"mathrm\", 1)"); menu_append_item ($1, "\\math&bf", "latex_cmd (\"mathbf\", 1)"); menu_append_item ($1, "\\math&sf", "latex_cmd (\"mathsf\", 1)"); menu_append_item ($1, "\\math&tt", "latex_cmd (\"mathtt\", 1)"); menu_append_item ($1, "\\math&it", "latex_font_mathit"); menu_append_item ($1, "\\math&normal", "latex_cmd (\"mathnormal\", 1)"); % sections menu_append_popup (menu, "&Sections"); $1 = sprintf ("%s.&Sections", menu); menu_append_item ($1, "\\p&art", "latex_cmd (\"part\", 1)"); menu_append_item ($1, "\\&chapter", "latex_cmd (\"chapter\", 1)"); menu_append_item ($1, "\\§ion", "latex_cmd (\"section\", 1)"); menu_append_item ($1, "\\s&ubsection", "latex_cmd (\"subsection\", 1)"); menu_append_item ($1, "\\su&bsubsection", "latex_cmd (\"subsubsection\", 1)"); menu_append_item ($1, "\\¶graph", "latex_cmd (\"paragraph\", 1)"); menu_append_item ($1, "\\subparagrap&h", "latex_cmd (\"subparagraph\", 1)"); % paragraph menu_append_popup (menu, "&Paragraph"); $1 = sprintf ("%s.&Paragraph", menu); menu_append_item ($1, "F&ramed Paragraph", "latex_par_frame"); menu_append_item ($1, "&background Colour", "latex_par_bgcolour"); menu_append_item ($1, "&foreground Colour", "latex_par_fgcolour"); menu_append_item ($1, "\\par&indent", "insert (\"\\\\setlength{\\\\parindent}{0pt}\\n\")"); menu_append_item ($1, "\\par&skip", "insert (\"\\\\setlength{\\\\parskip}{3pt}\\n\")"); menu_append_item ($1, "\\&marginpar", "latex_cmd (\"marginpar\", 1)"); menu_append_item ($1, "\\foot¬e", "latex_cmd (\"footnote\", 1)"); menu_append_item ($1, "\\inc&ludegraphics", "latex_includegraphics"); % paragraph popups: % paragraph/margins, paragraph/breaks, paragraph/boxes, paragraph/spaces menu_append_popup ($1, "&Margins"); menu_append_popup ($1, "Brea&ks"); menu_append_popup ($1, "&Spaces"); menu_append_popup ($1, "Bo&xes"); $1 = sprintf ("%s.&Paragraph.&Margins", menu); menu_append_item ($1, "\\&leftmargin", "latex_cmd (\"setlength{\\\\leftmargin}\", 1)"); menu_append_item ($1, "\\&rightmargin", "latex_cmd (\"setlength{\\\\rightmargin}\", 1)"); menu_append_item ($1, "\\&evensidemargin", "latex_cmd (\"setlength{\\\\evensidemargin}\", 1)"); menu_append_item ($1, "\\&oddsidemargin", "latex_cmd (\"setlength{\\\\oddsidemargin}\", 1)"); menu_append_item ($1, "\\&topmargin", "latex_cmd (\"setlength{\\\\topmargin}\", 1)"); menu_append_item ($1, "\\text&width", "latex_cmd (\"setlength{\\\\textwidth}\", 1)"); menu_append_item ($1, "\\text&height", "latex_cmd (\"setlength{\\\\textheight}\", 1)"); $1 = sprintf ("%s.&Paragraph.Brea&ks", menu); menu_append_item ($1, "\\new&line", "insert (\"\\\\newline\\n\")"); menu_append_item ($1, "\\line&break", "insert (\"\\\\linebreak[1]\\n\")"); menu_append_item ($1, "\\new&page", "insert (\"\\\\newpage\\n\")"); menu_append_item ($1, "\\&clearpage", "insert (\"\\\\clearpage\\n\")"); menu_append_item ($1, "\\clear&doublepage", "insert (\"\\\\cleardoublepage\\n\")"); menu_append_item ($1, "\\pageb&reak", "insert (\"\\\\pagebreak\\n\")"); menu_append_item ($1, "\\&nolinebreak", "insert (\"\\\\nolinebreak[1]\\n\")"); menu_append_item ($1, "\\n&opagebreak", "insert (\"\\\\nopagebreak\\n\")"); menu_append_item ($1, "\\&enlargethispage", "insert (\"\\\\enlargethispage\\n\")"); % paragraph/spaces $1 = sprintf ("%s.&Paragraph.&Spaces", menu); menu_append_item ($1, "\\&dotfill", "insert (\"\\\\dotfill\\n\")"); menu_append_item ($1, "\\&hfill", "insert (\"\\\\hfill\\n\")"); menu_append_item ($1, "\\h&rulefill", "insert (\"\\\\hrulefill\\n\")"); menu_append_item ($1, "\\&smallskip", "insert (\"\\\\smallskip\\n\")"); menu_append_item ($1, "\\&medskip", "insert (\"\\\\medskip\\n\")"); menu_append_item ($1, "\\&bigskip", "insert (\"\\\\bigskip\\n\")"); menu_append_item ($1, "\\&vfill", "insert (\"\\\\vfill\\n\")"); menu_append_item ($1, "\\hspace", "insert (\"\\\\hspace\\n\")"); menu_append_item ($1, "\\vs&pace", "insert (\"\\\\vspace\\n\")"); menu_append_item ($1, "Set \\baselines&kip", "insert (\"\\\\baselineskip 2\\\\baselineskip\\n\")"); % paragraph/boxes $1 = sprintf ("%s.&Paragraph.Bo&xes", menu); menu_append_item ($1, "\\&fbox", "latex_cmd (\"fbox\", 1)"); menu_append_item ($1, "\\f&ramebox", "latex_cmd (\"framebox[\\\\width][c]\", 1)"); menu_append_item ($1, "\\&mbox", "latex_cmd (\"mbox\", 1)"); menu_append_item ($1, "\\ma&kebox", "latex_cmd (\"makebox[\\\\width][c]\", 1)"); menu_append_item ($1, "\\&newsavebox", "latex_cmd (\"newsavebox\", 1)"); menu_append_item ($1, "\\ru&le", "latex_cmd (\"rule{\\\\linewidth}\", 1)"); menu_append_item ($1, "\\save&box", "latex_cmd (\"savebox{}[\\\\linewidth][c]\", 1)"); menu_append_item ($1, "\\&sbox", "latex_cmd (\"sbox{}\", 1)"); menu_append_item ($1, "\\&usebox", "latex_cmd (\"usebox\", 1)"); % links menu_append_popup (menu, "&Links"); $1 = sprintf ("%s.&Links", menu); menu_append_item ($1, "\\&label", "latex_cmd (\"label\", 1)"); menu_append_item ($1, "\\&ref", "latex_cmd (\"ref\", 1)"); menu_append_item ($1, "\\&cite", "latex_cmd (\"cite\", 1)"); menu_append_item ($1, "\\&nocite", "latex_cmd (\"nocite\", 1)"); menu_append_item ($1, "\\&url", "latex_url"); menu_append_item ($1, "\\&index", "latex_cmd (\"index\", 1)"); % math menu_append_popup (menu, "&Math"); $1 = sprintf ("%s.&Math", menu); % Math popups: % math/greek letter, math/accents, math/binary relations, % math/operators, math/arrows, math/misc menu_append_item ($1, "&Greek Letter...", "latex_greek_letter"); menu_append_item ($1, "&Subscript", "latex_insert_tags (\"_{\", \"}\", 1, 1)"); menu_append_item ($1, "S&uperscript", "latex_insert_tags (\"^{\", \"}\", 1, 1)"); menu_append_popup ($1, "&Accents"); menu_append_popup ($1, "&Delimiters"); menu_append_popup ($1, "Binary &Relations"); menu_append_popup ($1, "Binary &Operators"); menu_append_popup ($1, "Arro&ws"); menu_append_popup ($1, "&Misc"); % math/accents $1 = sprintf ("%s.&Math.&Accents", menu); menu_append_item ($1, "\\&bar", "latex_cmd (\"bar\", 1)"); menu_append_item ($1, "\\&dot", "latex_cmd (\"dot\", 1)"); menu_append_item ($1, "\\dd&ot", "latex_cmd (\"ddot\", 1)"); menu_append_item ($1, "\\&hat", "latex_cmd (\"hat\", 1)"); menu_append_item ($1, "\\&tilde", "latex_cmd (\"tilde\", 1)"); menu_append_item ($1, "\\&vec", "latex_cmd (\"vec\", 1)"); menu_append_item ($1, "\\&widehat", "latex_cmd (\"widehat\", 1)"); menu_append_item ($1, "\\wid&etilde", "latex_cmd (\"widetilde\", 1)"); % math/delimiters $1 = sprintf ("%s.&Math.&Delimiters", menu); menu_append_item ($1, "\\left&(", "latex_insert (\"left(\")"); menu_append_item ($1, "\\right&)", "latex_insert (\"right)\")"); menu_append_item ($1, "\\left&[", "latex_insert (\"left[\")"); menu_append_item ($1, "\\right&]", "latex_insert (\"right[\")"); menu_append_item ($1, "\\left&{", "latex_insert (\"left\\\\{\")"); menu_append_item ($1, "\\right&}", "latex_insert (\"right\\\\}\")"); % math/binary relations $1 = sprintf ("%s.&Math.Binary &Relations", menu); menu_append_item ($1, "\\&approx", "latex_insert (\"approx\")"); menu_append_item ($1, "\\&cong", "latex_insert (\"cong\")"); menu_append_item ($1, "\\&geq", "latex_insert (\"geq\")"); menu_append_item ($1, "\\&in", "latex_insert (\"in\")"); menu_append_item ($1, "\\notin", "latex_insert (\"notin\")"); menu_append_item ($1, "\\&leq", "latex_insert (\"leq\")"); menu_append_item ($1, "\\&neq", "latex_insert (\"neq\")"); menu_append_item ($1, "\\ll", "latex_insert (\"ll\")"); menu_append_item ($1, "\\gg", "latex_insert (\"gg\")"); menu_append_item ($1, "\\&equiv", "latex_insert (\"equiv\")"); menu_append_item ($1, "\\&sim", "latex_insert (\"sim\")"); menu_append_item ($1, "\\sime&q", "latex_insert (\"simeq\")"); menu_append_item ($1, "\\&propto", "latex_insert (\"propto\")"); % math/binary operators $1 = sprintf ("%s.&Math.Binary &Operators", menu); menu_append_item ($1, "\\&ast", "latex_insert (\"ast\")"); menu_append_item ($1, "\\&dagger", "latex_insert (\"dagger\")"); menu_append_item ($1, "\\dda&ger", "latex_insert (\"ddagger\")"); menu_append_item ($1, "\\&mp", "latex_insert (\"mp\")"); menu_append_item ($1, "\\&pm", "latex_insert (\"pm\")"); menu_append_item ($1, "\\&star", "latex_insert (\"star\")"); menu_append_item ($1, "\\×", "latex_insert (\"times\")"); % math/arrows $1 = sprintf ("%s.&Math.Arro&ws", menu); menu_append_item ($1, "\\&leftarrow", "latex_insert (\"leftarrow\")"); menu_append_item ($1, "\\&rightarrow", "latex_insert (\"rightarrow\")"); menu_append_item ($1, "\\&uparrow", "latex_insert (\"uparrow\")"); menu_append_item ($1, "\\&downarrow", "latex_insert (\"downarrow\")"); menu_append_item ($1, "\\&leftrightarrow", "latex_insert (\"leftrightarrow\")"); % math/misc $1 = sprintf ("%s.&Math.&Misc", menu); menu_append_item ($1, "\\&exists", "latex_insert (\"exists\")"); menu_append_item ($1, "\\&forall", "latex_insert (\"forall\")"); menu_append_item ($1, "\\f&rac", "latex_insert (\"frac{}{}\")"); menu_append_item ($1, "\\in&fty", "latex_insert (\"infty\")"); menu_append_item ($1, "\\&int", "latex_insert_nospace (\"int\")"); menu_append_item ($1, "\\&nabla", "latex_insert (\"nabla\")"); menu_append_item ($1, "\\&oint", "latex_insert (\"oint\")"); menu_append_item ($1, "\\p&artial", "latex_insert (\"partial\")"); menu_append_item ($1, "\\&prod", "latex_insert (\"prod\")"); menu_append_item ($1, "\\&sum", "latex_insert (\"sum\")"); menu_append_item ($1, "\\s&qrt", "latex_insert (\"sqrt[]{}\")"); % bibliography menu_append_popup (menu, "&Bibliography"); $1 = sprintf ("%s.&Bibliography", menu); menu_append_item ($1, "&thebibliography", "latex_begin_end (\"thebibliography\", \"{99}\", 1, 1)"); menu_append_item ($1, "\\bib&item", "latex_cmd (\"bibitem\", 1)"); menu_append_item ($1, "\\&bibliography", "latex_insert (\"bibliography\")"); menu_append_item ($1, "\\bibliography&style", "latex_insert (\"bibliographystyle\")"); % separator $1 = sprintf ("%s", menu); menu_append_separator ($1); menu_append_item ($1, "Set M&aster File", "latex_master_file"); menu_append_item ($1, "Select &Output", "latex_select_output"); menu_append_item ($1, "&Compose", "latex_compose"); menu_append_item ($1, "&View", "latex_view"); #ifndef WIN32 menu_append_item ($1, "P&rint", "latex_psprint"); #endif menu_append_item ($1, "B&ibTeX", "latex_bibtex"); menu_append_item ($1, "Makeinde&x", "latex_makeindex"); menu_append_item ($1, "&Document Outline", "latex_browse_tree"); menu_append_separator ($1); menu_append_item ($1, "LaTeX Mode &Help", "latex_mode_help"); } %}}} % The Keymap %{{{ % ----- % normally, folding and latex mode are incompatible because of clashing % ^Cf... key bindings. I don't want to give up ^Cf, so this key binding % can be customized using the following variable. custom_variable ("LaTeX_Font_Key", "f"); % suggested alternative: "n" define latex_keymap () { $1 = "LaTeX-Mode";; !if (keymap_p ($1)) make_keymap ($1); use_keymap ($1); % templates - ^CT definekey_reserved ("latex_article", "ta", $1); definekey_reserved ("latex_book", "tb", $1); definekey_reserved ("latex_letter", "tl", $1); definekey_reserved ("latex_report", "tr", $1); definekey_reserved ("latex_slides", "ts", $1); definekey_reserved ("latex_notice", "tn", $1); definekey_reserved ("latex_prosper", "to", $1); % environments - ^CE definekey_reserved ("latex_begin_end (\"array\", \"{ll}\", 1, 1)", "ea", $1); definekey_reserved ("latex_begin_end (\"center\", \"\", 1, 1)", "ec", $1); definekey_reserved ("latex_begin_end (\"description\", \"\", 1, 1)", "ed", $1); definekey_reserved ("latex_begin_end (\"displaymath\", \"\", 1, 1)", "eh", $1); definekey_reserved ("latex_begin_end (\"enumerate\", \"\", 1, 1)", "ee", $1); definekey_reserved ("latex_begin_end (\"eqnarray\", \"\", 1, 1)", "en", $1); definekey_reserved ("latex_begin_end (\"equation\", \"\", 1, 1)", "eq", $1); definekey_reserved ("latex_env_figure ()", "ef", $1); definekey_reserved ("latex_begin_end (\"flushleft\", \"\", 1, 1)", "el", $1); definekey_reserved ("latex_begin_end (\"flushright\", \"\", 1, 1)", "eR", $1); definekey_reserved ("latex_env_item", "ei", $1); definekey_reserved ("latex_env_itemize", "eI", $1); % definekey_reserved ("latex_env_letter", "eL", $1); definekey_reserved ("latex_begin_end (\"list\", \"\", 1, 1)", "eL", $1); definekey_reserved ("latex_begin_end (\"minipage\"," + " \"[c]{\\\\linewidth}\", 1, 1)", "em", $1); definekey_reserved ("latex_begin_end (\"picture\", \"\", 1, 1)", "ep", $1); definekey_reserved ("latex_begin_end (\"quotation\", \"\", 1, 1)", "eQ", $1); definekey_reserved ("latex_begin_end (\"quote\", \"\", 1, 1)", "eo", $1); definekey_reserved ("latex_begin_end (\"tabbing\", \"\", 1, 1)", "eb", $1); definekey_reserved ("latex_table_template (1)", "eu", $1); definekey_reserved ("latex_table_template (0)", "et", $1); definekey_reserved ("latex_table_row (1)", "er", $1); % definekey_reserved ("latex_begin_end (\"thebibliography\", \"\", 1, 1)", definekey_reserved ("latex_begin_end (\"thebibliography\", \"{99}\", 1, 1)", "ey", $1); definekey_reserved ("latex_begin_end (\"theorem\", \"\", 1, 1)", "eH", $1); definekey_reserved ("latex_begin_end (\"titlepage\", \"\", 1, 1)", "eg", $1); definekey_reserved ("latex_begin_end (\"verbatim\", \"\", 1, 1)", "ev", $1); definekey_reserved ("latex_begin_end (\"verse\", \"\", 1, 1)", "es", $1); definekey_reserved ("latex_env_custom ()", "eC", $1); % fonts - ^CF (normally) definekey_reserved ("latex_cmd (\"textrm\", 1)", LaTeX_Font_Key + "r", $1); definekey_reserved ("latex_cmd (\"textit\", 1)", LaTeX_Font_Key + "i", $1); definekey_reserved ("latex_cmd (\"emph\", 1)", LaTeX_Font_Key + "e", $1); definekey_reserved ("latex_cmd (\"textmd\", 1)", LaTeX_Font_Key + "m", $1); definekey_reserved ("latex_cmd (\"textbf\", 1)", LaTeX_Font_Key + "b", $1); definekey_reserved ("latex_cmd (\"textup\", 1)", LaTeX_Font_Key + "u", $1); definekey_reserved ("latex_cmd (\"textsl\", 1)", LaTeX_Font_Key + "s", $1); definekey_reserved ("latex_cmd (\"textsf\", 1)", LaTeX_Font_Key + "f", $1); definekey_reserved ("latex_cmd (\"textsc\", 1)", LaTeX_Font_Key + "c", $1); definekey_reserved ("latex_cmd (\"texttt\", 1)", LaTeX_Font_Key + "t", $1); definekey_reserved ("latex_insert_tags (\"\\\\verb|\", \"|\", 1, 1)", LaTeX_Font_Key + "v", $1); definekey_reserved ("latex_cmd (\"textnormal\", 1)", LaTeX_Font_Key + "n", $1); definekey_reserved ("latex_cmd (\"underline\", 1)", LaTeX_Font_Key + "d", $1); % font size - ^CZ definekey_reserved ("latex_cmd (\"tiny\", 1)", "zt", $1); definekey_reserved ("latex_cmd (\"scriptsize\", 1)", "zc", $1); definekey_reserved ("latex_cmd (\"footnotesize\", 1)", "zf", $1); definekey_reserved ("latex_cmd (\"small\", 1)", "zs", $1); definekey_reserved ("latex_cmd (\"normalsize\", 1)", "zn", $1); definekey_reserved ("latex_cmd (\"large\", 1)", "zl", $1); definekey_reserved ("latex_cmd (\"Large\", 1)", "zL", $1); definekey_reserved ("latex_cmd (\"LARGE\", 1)", "zA", $1); definekey_reserved ("latex_cmd (\"huge\", 1)", "zh", $1); definekey_reserved ("latex_cmd (\"Huge\", 1)", "zH", $1); % sections - ^CS definekey_reserved ("latex_cmd (\"chapter\", 1)", "sc", $1); definekey_reserved ("latex_cmd (\"section\", 1)", "ss", $1); definekey_reserved ("latex_cmd (\"subsection\", 1)", "su", $1); definekey_reserved ("latex_cmd (\"subsubsection\", 1)", "sb", $1); definekey_reserved ("latex_cmd (\"paragraph\", 1)", "sp", $1); definekey_reserved ("latex_cmd (\"subparagraph\", 1)", "sh", $1); definekey_reserved ("latex_cmd (\"part\", 1)", "sa", $1); % paragraphs - ^CP definekey_reserved ("latex_par_frame" , "pr", $1); definekey_reserved ("latex_par_bgcolour" , "pb", $1); definekey_reserved ("latex_par_fgcolour" , "pf", $1); definekey_reserved ("insert (\"\\\\setlength{\\\\parindent}{0pt}\\n\")" , "pi", $1); definekey_reserved ("insert (\"\\\\setlength{\\\\parskip}{3pt}\\n\")" , "ps", $1); definekey_reserved ("latex_cmd (\"marginpar\", 1)", "pm", $1); definekey_reserved ("latex_cmd (\"footnote\", 1)", "pn", $1); definekey_reserved ("latex_includegraphics", "pl", $1); % links - ^CL definekey_reserved ("latex_cmd (\"label\", 1)", "ll", $1); definekey_reserved ("latex_cmd (\"ref\", 1)", "lr", $1); definekey_reserved ("latex_cmd (\"cite\", 1)", "lc", $1); definekey_reserved ("latex_cmd (\"nocite\", 1)", "ln", $1); definekey_reserved ("latex_cmd (\"pageref\", 1)", "lp", $1); definekey_reserved ("latex_url", "lu", $1); % math arrows - ^C + arrow definekey_reserved ("latex_insert (\"uparrow\")", Key_Up, $1); definekey_reserved ("latex_insert (\"downarrow\")", Key_Down, $1); definekey_reserved ("latex_insert (\"leftarrow\")", Key_Left, $1); definekey_reserved ("latex_insert (\"rightarrow\")", Key_Right, $1); % index - ^CI definekey_reserved ("latex_cmd (\"index\", 1)", "I", $1); % breaks - ^CK definekey_reserved ("insert (\"\\\\newline\\n\")", "kl", $1); definekey_reserved ("insert (\"\\\\linebreak[1]\\n\")", "kb", $1); definekey_reserved ("insert (\"\\\\newpage\\n\")", "kp", $1); definekey_reserved ("insert (\"\\\\clearpage\\n\")", "kc", $1); definekey_reserved ("insert (\"\\\\cleardoublepage\\n\")", "kd", $1); definekey_reserved ("insert (\"\\\\pagebreak\\n\")", "kr", $1); definekey_reserved ("insert (\"\\\\nolinebreak[1]\\n\")", "kn", $1); definekey_reserved ("insert (\"\\\\nopagebreak\\n\")", "ko", $1); definekey_reserved ("insert (\"\\\\enlargethispage\\n\")", "ke", $1); % misc definekey_reserved ("latex_insert_tags (\"{\", \"}\", 1, 1)", "{", $1); definekey_reserved ("latex_insert_math ()", "m", $1); % from tex.sl definekey ("tex_insert_quote", "\"", $1); definekey ("tex_insert_quote", "'", $1); definekey ("tex_blink_dollar", "$", $1); definekey ("tex_ldots", ".", $1); definekey ("tex_complete_symbol", "^[^I", $1); % from the old latex.sl definekey_reserved ("latex_open_env", "[", $1); definekey_reserved ("latex_close_env", "]", $1); definekey_reserved ("call (\"newline_and_indent\"); latex_env_item", "^M", $1); % special characters definekey_reserved (" \\$", "$", $1); definekey_reserved (" \\&", "&", $1); definekey_reserved (" \\%", "%", $1); definekey_reserved (" \\_", "_", $1); definekey_reserved (" \\#", "#", $1); definekey_reserved (" \\{", "(", $1); definekey_reserved (" \\}", ")", $1); definekey_reserved (" \\textless", "<", $1); definekey_reserved (" \\textgreater", ">", $1); definekey_reserved (" \\textbackslash{}", "\\", $1); definekey_reserved (" \\textbar", "|", $1); definekey_reserved (" \\textasciicircum", "^", $1); definekey_reserved (" \\textasciitilde", "~", $1); % final stuff definekey_reserved ("latex_master_file", "a", $1); definekey_reserved ("latex_select_output", "o", $1); definekey_reserved ("latex_compose", "c", $1); definekey_reserved ("latex_view", "v", $1); definekey_reserved ("latex_psprint", "r", $1); definekey_reserved ("latex_bibtex", "i", $1); definekey_reserved ("latex_makeindex", "x", $1); definekey_reserved ("latex_browse_tree", "d", $1); } %}}} % ----- $1 = "LaTeX-Mode"; create_syntax_table ($1); define_syntax ("%", "", '%', $1); % Comment Syntax define_syntax ('\\', '\\', $1); % Quote character define_syntax ("{[", "}]", '(', $1); define_syntax ('$', '"', $1); % string define_syntax ("~^_&#", '+', $1); % operators define_syntax ("|&{}[]", ',', $1); % delimiters define_syntax ("a-zA-Z@", 'w', $1); set_syntax_flags ($1, 8); % the DFA syntax highlighting has a bug. Highlighting spanning % multiple lines will not work. Why? #ifdef HAS_DFA_SYNTAX %%% DFA_CACHE_BEGIN %%% static define setup_dfa_callback (name) { dfa_enable_highlight_cache ("latex.dfa", name); % comments: dfa_define_highlight_rule ("%.*$", "comment", name); % anything between curly braces dfa_define_highlight_rule ("{.*}", "Qkeyword1", name); dfa_define_highlight_rule("^([^{])*}", "Qkeyword1", name); dfa_define_highlight_rule("{.*", "keyword1", name); % short symbols that delimit math: $ \[ \] \( \) dfa_define_highlight_rule ("\\$|(\\\\[\\[\\]\\(\\)])", "string", name); % Fundamental delimiters in the TeX language: {}[] dfa_define_highlight_rule ("[{}\\[\\]]", "delimiter", name); % \leftX \rightY constructions where X and Y are % one of \| \{ \} [ ] ( ) / | . dfa_define_highlight_rule ("\\\\(left|right)(\\\\\\||\\\\{|\\\\}|" + "[\\[\\]\\(\\)/\\|\\.])", "delimiter", name); % type 0 keywords: a backslash followed by one or more letters: dfa_define_highlight_rule ("\\\\[A-Za-z@]+", "keyword", name); % type 1 keywords: a backslash followed by one of -,:!%$#&_ |\/{}~^´'``.= : dfa_define_highlight_rule ("\\\\[\\-,:!%\\$#&_ \\|\\\\/{}~\\^'`\\.=:]", "keyword1", name); % a backslash followed by a single char not covered by one of the % previous rules is probably an error dfa_define_highlight_rule ("\\\\.", "error", name); % The symbols ~ ^ _ dfa_define_highlight_rule ("[~\\^_]", "operator", name); % numbers dfa_define_highlight_rule ("[0-9]", "number", name); % Macro parameters (#1 #2 etc) dfa_define_highlight_rule ("#[1-9]", "operator", name); dfa_define_highlight_rule ("``.*''", "string", name); dfa_define_highlight_rule (".", "normal", name); dfa_build_highlight_table (name); } dfa_set_init_callback (&setup_dfa_callback, "LaTeX-Mode"); %%% DFA_CACHE_END %%% #endif % ----- %!%+ %\function{latex_mode} %\synopsis{latex_mode} %\usage{Void latex_mode ();} %\description % This mode is designed to facilitate the task of editing latex files. % It calls the function \var{latex_mode_hook} if it is defined. In addition, % if the abbreviation table \var{"TeX"} is defined, that table is used. % % There are way too many key-bindings for this mode. % Please have a look at the menus! %!%- define latex_mode () { latex_keymap (); set_mode ("LaTeX", 0x1 | 0x20); set_buffer_hook ("par_sep", "tex_paragraph_separator"); set_buffer_hook ("wrap_hook", "tex_wrap_hook"); % latex math mode will map this to something else. local_unsetkey ("`"); local_setkey ("quoted_insert", "`"); mode_set_mode_info ("LaTeX", "init_mode_menu", &init_menu); use_syntax_table ("LaTeX-Mode"); mode_set_mode_info ("LaTeX", "fold_info", "%{{{\r%}}}\r\r"); run_mode_hooks ("latex_mode_hook"); if (abbrev_table_p ("LaTeX")) use_abbrev_table ("LaTeX"); } % ----- provide ("latex"); % --- End of file latex.sl