yuuji@286: ;;; yatex.el --- Yet Another tex-mode for emacs //野鳥// -*- coding: sjis -*- yuuji@509: ;;; (c)1991-2018 by HIROSE Yuuji.[yuuji@yatex.org] yuuji@534: ;;; Last modified Wed May 30 23:22:15 2018 on firestorm yuuji@366: ;;; $Id$ yuuji@69: ;;; The latest version of this software is always available at; yuuji@484: ;;; https://www.yatex.org/ yuuji@0: yuuji@495: ;;; This program is distributed as a free software. You can yuuji@495: ;;; use/copy/modify/redistribute this software freely but with NO yuuji@495: ;;; warranty to anything as a result of using this software. Adopting yuuji@495: ;;; code from this program is also free. But I would not do contract yuuji@495: ;;; act. yuuji@495: ;;; yuuji@495: ;;; This software can be treated with: ``The 2-Clause BSD License'' yuuji@495: ;;; (since 2017-09-09, yatex 1.80). yuuji@495: yuuji@286: ;;; Code: yuuji@64: (require 'yatexlib) yuuji@534: (defconst YaTeX-revision-number "1.80.3" yuuji@69: "Revision number of running yatex.el") yuuji@69: yuuji@0: ;---------- Local variables ---------- yuuji@22: (defvar YaTeX-prefix "\C-c" yuuji@59: "*Prefix key to call YaTeX functions. yuuji@69: You can select favorite prefix key by setq in your ~/.emacs.") yuuji@69: yuuji@11: (defvar YaTeX-environment-indent 1 yuuji@69: "*Indentation depth at column width in LaTeX environments.") yuuji@69: yuuji@64: (defvar YaTeX-fill-prefix nil yuuji@5: "*fill-prefix used for auto-fill-mode. yuuji@69: The default value is nil.") yuuji@69: yuuji@5: (defvar YaTeX-fill-column 72 yuuji@69: "*fill-column used for auto-fill-mode.") yuuji@69: yuuji@4: (defvar YaTeX-comment-prefix "%" yuuji@69: "TeX comment prefix.") yuuji@69: yuuji@5: (defvar YaTeX-current-position-register ?3 yuuji@22: "*Position register to keep where the last completion was done. yuuji@22: All of YaTeX completing input store the current position into yuuji@5: the register YaTeX-current-position-register. So every time you yuuji@52: make a trip to any other part of text other than you are writing, you can yuuji@13: return to the editing paragraph by calling register-to-point with argument yuuji@69: YaTeX-current-position-register.") yuuji@69: yuuji@286: (defvar YaTeX-use-LaTeX2e t "*Use LaTeX2e or not. Nil means latex 2.09") yuuji@72: yuuji@72: (defvar tex-command yuuji@72: (cond yuuji@503: (YaTeX-use-LaTeX2e "platex -kanji=%k") yuuji@72: (YaTeX-japan "jlatex") yuuji@72: (t "latex")) yuuji@412: "*Default command for typesetting LaTeX text. yuuji@503: Overridden with `%#! CommandLine...' in the buffer. yuuji@503: `%'s followed by a character are replaced as follows: yuuji@503: %f -> Parent(main) document file name yuuji@503: %r -> %f without extension yuuji@503: %k -> One of Kanji code mnemonic: euc, jis, sjis, utf8 yuuji@503: ") yuuji@69: yuuji@506: (defvar bibtex-command (if YaTeX-japan "pbibtex -kanji=%k" "bibtex") yuuji@412: "*Default command of BibTeX. yuuji@508: Overridden with `%#BIBTEX CommandLine...' in the buffer. yuuji@508: Pettern `%k' in a string will be replaced with Kanji-code mnemonic of ptex.") yuuji@69: yuuji@0: (defvar dvi2-command ;previewer command for your site yuuji@468: (cond (YaTeX-dos "dviout -wait=0") yuuji@468: (YaTeX-macos "open -a Preview") yuuji@468: (t "xdvi -geo +0+0 -s 4")) yuuji@5: "*Default previewer command including its option. yuuji@412: Overridden with `%#PREVIEW CommandLine...' in the buffer.") yuuji@69: yuuji@334: (defvar YaTeX-cmd-gimp "gimp") yuuji@334: (defvar YaTeX-cmd-tgif "tgif") yuuji@334: (defvar YaTeX-cmd-inkscape "inkscape") yuuji@334: (defvar YaTeX-cmd-dia "dia") yuuji@334: (defvar YaTeX-cmd-ooo "soffice") yuuji@334: (defvar YaTeX-cmd-gs "gs") yuuji@400: (defvar YaTeX-cmd-dvips yuuji@400: (if (YaTeX-executable-find "pdvips") "pdvips" "dvips")) yuuji@361: (defvar YaTeX-cmd-displayline yuuji@361: "/Applications/Skim.app/Contents/SharedSupport/displayline") yuuji@334: (defvar YaTeX-cmd-edit-ps YaTeX-cmd-gimp) yuuji@334: (defvar YaTeX-cmd-edit-pdf YaTeX-cmd-ooo) yuuji@334: (defvar YaTeX-cmd-edit-ai YaTeX-cmd-inkscape) yuuji@334: (defvar YaTeX-cmd-edit-svg YaTeX-cmd-inkscape) yuuji@334: (defvar YaTeX-cmd-edit-images YaTeX-cmd-gimp) yuuji@362: (defvar YaTeX-cmd-view-images "display -geometry +0+0") yuuji@334: yuuji@327: (defvar tex-pdfview-command ;previewer command for your site yuuji@327: (cond yuuji@327: (YaTeX-dos "acroread") yuuji@361: (YaTeX-macos (cond yuuji@361: ((file-executable-p YaTeX-cmd-displayline) "open -a Skim") yuuji@361: (t "open"))) yuuji@525: ((YaTeX-executable-find "evince") "evince") yuuji@525: ((YaTeX-executable-find "xreader") "xreader") yuuji@525: ((YaTeX-executable-find "atril") "atril") yuuji@525: ((YaTeX-executable-find "okular") "okular") yuuji@525: ((YaTeX-executable-find "kpdf") "kpdf") yuuji@525: ((YaTeX-executable-find "xpdf") "xpdf") yuuji@525: ((YaTeX-executable-find "mupdf") "mupdf") yuuji@525: (t "acroread")) yuuji@412: "*Default PDF viewer command including its option. yuuji@412: Overridden with `%#PDFVIEW CommandLine...' in the buffer.") yuuji@327: yuuji@13: (defvar makeindex-command (if YaTeX-dos "makeind" "makeindex") yuuji@412: "*Default makeindex command. yuuji@412: Overridden with `%#MAKEINDEX CommandLine...' in the buffer.") yuuji@69: yuuji@5: (defvar dviprint-command-format yuuji@13: (if YaTeX-dos "dviprt %s %f%t" yuuji@5: "dvi2ps %f %t %s | lpr") yuuji@22: "*Command line string to print out current file. yuuji@412: Overridden with `%#LPR CommandLine...' in the buffer. yuuji@22: Format string %s will be replaced by the filename. Do not forget to yuuji@22: specify the `from usage' and `to usage' with their option by format string yuuji@22: %f and %t. yuuji@69: See also documentation of dviprint-from-format and dviprint-to-format.") yuuji@69: yuuji@5: (defvar dviprint-from-format yuuji@13: (if YaTeX-dos "%b-" "-f %b") yuuji@69: "*`From' page format of dvi filter. %b will turn to beginning page number.") yuuji@69: yuuji@5: (defvar dviprint-to-format yuuji@13: (if YaTeX-dos "%e" "-t %e") yuuji@69: "*`To' page format of dvi filter. %e will turn to end page number.") yuuji@69: yuuji@123: (defvar YaTeX-dvipdf-command yuuji@123: "dvipdfmx" yuuji@412: "*Command name to convert dvi file to PDF. yuuji@412: Overridden with `%#DVIPDF CommandLine...' in the buffer.") yuuji@123: yuuji@5: (defvar YaTeX-default-document-style yuuji@347: (concat (if YaTeX-japan "js") "article") yuuji@69: "*Default LaTeX Documentstyle for YaTeX-typeset-region.") yuuji@69: yuuji@5: (defvar YaTeX-need-nonstop nil yuuji@69: "*T for adding `\\nonstopmode{}' to text before invoking latex command.") yuuji@69: yuuji@0: (defvar latex-warning-regexp "line.* [0-9]*" yuuji@69: "*Regular expression of line number of warning message by latex command.") yuuji@69: yuuji@0: (defvar latex-error-regexp "l\\.[1-9][0-9]*" yuuji@22: "*Regular expression of line number of latex error. yuuji@22: Perhaps your latex command stops at this error message with line number of yuuji@69: LaTeX source text.") yuuji@69: yuuji@1: (defvar latex-dos-emergency-message yuuji@3: "Emergency stop" ;<- for Micro tex, ASCII-pTeX 1.6 yuuji@22: "Message pattern of emergency stop of typesetting. yuuji@22: Because Demacs (GNU Emacs on DOS) cannot have concurrent process, the yuuji@0: latex command which is stopping on a LaTeX error, is terminated by Demacs. yuuji@13: Many latex command on DOS display some messages when it is terminated by yuuji@13: other process, user or OS. Define to this variable a message string of your yuuji@13: latex command on DOS shown at abnormal termination. yuuji@0: Remember Demacs's call-process function is not oriented for interactive yuuji@69: process.") yuuji@69: yuuji@64: (defvar NTT-jTeX nil yuuji@64: "*T for using NTT-jTeX for latex command. yuuji@64: More precisely, setting t to this variables inhibits inter-word break on yuuji@64: typeset document by line-break of source text. That is, YaTeX automatically yuuji@64: put % after each line at filling. yuuji@64: 改行+インデントによって、タイプセット後の字間が空いてしまうのを抑制する場合に yuuji@64: tにする(古いNTT-jTeXで顕著に現れる)。具体的には、fillするときに各行の終わりに yuuji@69: %を付加する。") yuuji@69: yuuji@70: yuuji@64: (defvar YaTeX-item-regexp yuuji@64: (concat (regexp-quote "\\") "\\(sub\\|bib\\)*item") yuuji@69: "*Regular expression of item command.") yuuji@69: yuuji@7: (defvar YaTeX-sectioning-regexp yuuji@69: "\\(part\\|chapter\\*?\\|\\(sub\\)*\\(section\\|paragraph\\)\\)\\(\\*\\|\\b\\)" yuuji@69: "*LaTeX sectioning commands regexp.") yuuji@69: yuuji@58: (defvar YaTeX-paragraph-start yuuji@59: (concat "^[ \t]*%\\|^[ \t]*$\\|\\'\\|^\C-l\\|\\\\\\\\$\\|^[ \t]*\\\\\\(" yuuji@13: YaTeX-sectioning-regexp ;sectioning commands yuuji@7: "\\|[A-z]*item\\|begin{\\|end{" ;special declaration yuuji@70: "\\|\\[\\|\\]" yuuji@59: "\\|newpage\\b\\|vspace\\b" yuuji@7: "\\)") yuuji@58: "*Paragraph starting regexp of common LaTeX source. Use this value yuuji@69: for YaTeX-uncomment-paragraph.") yuuji@69: yuuji@58: (defvar YaTeX-paragraph-separate yuuji@58: (concat "^[ \t]*%\\|^[ \t]*$\\|^\C-l\\|\\\\\\\\$\\|^[ \t]*\\\\\\(" yuuji@58: YaTeX-sectioning-regexp ;sectioning commands yuuji@58: "\\|begin{\\|end{" ;special declaration yuuji@68: "\\|\\[\\|\\]" yuuji@59: "\\|newpage\\b\\|vspace\\b" yuuji@58: "\\)") yuuji@7: "*Paragraph delimiter regexp of common LaTeX source. Use this value yuuji@69: for YaTeX-uncomment-paragraph.") yuuji@69: yuuji@49: (defvar YaTeX-verbatim-environments yuuji@177: '("verbatim" "verbatim*" "alltt") yuuji@49: "*Assume these environments of this variable disable LaTeX commands.") yuuji@177: (defvar YaTeX-verb-regexp "verb\\*?\\|path" yuuji@51: "*Regexp of verb family. Do not contain preceding \\\\ nor \\(\\).") yuuji@49: (defvar YaTeX-fill-inhibit-environments yuuji@49: (append '("tabular" "tabular*" "array" "picture" "eqnarray" "eqnarray*" yuuji@307: "longtable" yuuji@69: "equation" "equation*" "math" "displaymath") yuuji@49: YaTeX-verbatim-environments) yuuji@13: "*In these environments, YaTeX inhibits fill-paragraph from formatting. yuuji@69: Define those environments as a form of list.") yuuji@69: yuuji@52: (defvar YaTeX-itemizing-env-regexp yuuji@64: "itemize\\|enumerate\\|description\\|list\\|thebibliography" yuuji@53: "*Regexp of itemizing environments") yuuji@53: (defvar YaTeX-equation-env-regexp yuuji@54: "array\\*?\\|equation\\*?" yuuji@53: "*Regexp of environments for equations") yuuji@57: (defvar YaTeX-array-env-regexp yuuji@58: (concat yuuji@58: "array\\*?\\|eqnarray\\*?\\|tabbing\\|tabular\\*?\\|" ;LaTeX yuuji@307: "longtable\\|" ;LaTeX2e yuuji@69: "matrix\\|pmatrix\\|bmatrix\\|vmatrix\\|Vmatrix\\|" ;AMS-LaTeX yuuji@58: "align\\*?\\|split\\*?\\|aligned\\*?\\|alignat\\*?\\|" ;AMS-LaTeX yuuji@68: "[bpvV]?matrix\\|smallmatrix\\|cases\\|" ;AMS-LaTeX yuuji@58: "xalignat\\*?\\|xxalignat\\*?") ;AMS-LaTeX yuuji@57: "*Regexp of environments where `&' becomes field delimiter.") yuuji@11: (defvar YaTeX-uncomment-once t yuuji@22: "*T for removing all continuous commenting character(%). yuuji@69: Nil for removing only one commenting character at the beginning-of-line.") yuuji@69: yuuji@22: (defvar YaTeX-close-paren-always t yuuji@69: "*Close parenthesis always when YaTeX-modify-mode is nil.") yuuji@69: yuuji@22: (defvar YaTeX-greek-by-maketitle-completion nil yuuji@69: "*T for greek letters completion by maketitle-type completion.") yuuji@69: yuuji@22: (defvar YaTeX-auto-math-mode t yuuji@22: "*T for changing YaTeX-math mode automatically.") yuuji@316: (defvar YaTeX-use-AMS-LaTeX t yuuji@69: "*T for using AMS-LaTeX") yuuji@69: yuuji@22: (defvar yatex-mode-hook nil yuuji@69: "*List of functions to be called at the end of yatex-mode initializations.") yuuji@69: yuuji@70: (defvar YaTeX-search-file-from-top-directory t yuuji@72: "*Non-nil means to search input-files from the directory where main file exists.") yuuji@72: yuuji@72: (defvar YaTeX-use-font-lock (and (featurep 'font-lock) yuuji@72: (fboundp 'x-color-values) yuuji@72: (fboundp 'font-lock-fontify-region)) yuuji@72: "*Use font-lock to fontify buffer or not.") yuuji@72: yuuji@72: (defvar YaTeX-use-hilit19 (and (featurep 'hilit19) (fboundp 'x-color-values) yuuji@73: (fboundp 'hilit-translate) yuuji@73: (not YaTeX-use-font-lock)) yuuji@72: "*Use hilit19 to highlight buffer or not.") yuuji@70: yuuji@82: (defvar YaTeX-tabular-indentation 4 yuuji@82: "*Indentation column-depth of continueing line in tabular environment.") yuuji@82: yuuji@409: (defvar YaTeX-electric-indent-mode -1 yuuji@409: "*(for Emacs 24.4+) Pass this value to electric-indent-local-mode. yuuji@409: -1 means `off'.") yuuji@409: yuuji@22: ;;-- Math mode values -- yuuji@22: yuuji@22: (defvar YaTeX-math-key-list-default yuuji@22: '((";" . YaTeX-math-sign-alist) yuuji@52: (":" . YaTeX-greek-key-alist)) yuuji@69: "Default key sequence to invoke math-mode's image completion.") yuuji@69: yuuji@22: (defvar YaTeX-math-key-list-private nil yuuji@69: "*User defined alist, math-mode-prefix vs completion alist.") yuuji@69: yuuji@22: (defvar YaTeX-math-key-list yuuji@22: (append YaTeX-math-key-list-private YaTeX-math-key-list-default) yuuji@69: "Key sequence to invoke math-mode's image completion.") yuuji@69: yuuji@54: (defvar YaTeX-skip-default-reader nil yuuji@69: "Non-nil skips default argument reader of section-type completion.") yuuji@69: yuuji@54: (defvar YaTeX-simple-messages nil yuuji@69: "Non-nil makes minibuffer messages simpler.") yuuji@69: yuuji@64: (defvar YaTeX-template-file "~/work/template.tex" yuuji@69: "*Template TeX source file. This will be inserted to empty file.") yuuji@69: yuuji@57: (defvar YaTeX-addin-prefix "YaTeX:") yuuji@73: yuuji@73: (defvar yatex-mode-abbrev-table nil yuuji@73: "*Abbrev table in use in yatex-mode buffers.") yuuji@73: (define-abbrev-table 'yatex-mode-abbrev-table ()) yuuji@73: yuuji@73: yuuji@0: ;------------ Completion table ------------ yuuji@0: ; Set tex-section-like command possible completion yuuji@22: (defvar section-table yuuji@70: (append yuuji@70: '(("part") ("chapter") ("chapter*") ("section") ("section*") yuuji@70: ("subsection") ("subsection*") yuuji@70: ("subsubsection") ("paragraph") ("subparagraph") yuuji@72: ("author") ("thanks") ("documentstyle") ("pagestyle") ("thispagestyle") yuuji@70: ("title") ("underline") ("label") ("makebox") yuuji@70: ("footnote") ("footnotetext") ("index") yuuji@528: ("hspace*") ("vspace*") yuuji@528: ("bibliography") ("bibliographystyle") ("bibitem") ("cite") yuuji@70: ("input") ("include") ("includeonly") ("mbox") ("hbox") ("caption") yuuji@523: ("arabic") ("centering") ("uline") yuuji@82: ("newcounter") yuuji@70: ("newlength") ("setlength" 2) ("addtolength" 2) ("settowidth" 2) yuuji@70: ("setcounter" 2) ("addtocounter" 2) ("stepcounter" 2) yuuji@70: ("newcommand" 2) ("renewcommand" 2) yuuji@82: ("newenvironment" 3) ("newtheorem" 2) yuuji@70: ("cline") ("framebox") ("savebox" 2) ("sbox" 2) ("newsavebox") ("usebox") yuuji@82: ("date") ("put") ("ref") ("pageref") ("tabref") ("figref") ("raisebox" 2) yuuji@82: ("multicolumn" 3) ("shortstack") ("parbox" 2) yuuji@70: ;; for mathmode accent yuuji@70: ("tilde") ("hat") ("check") ("bar") ("dot") ("ddot") ("vec") yuuji@70: ("widetilde") ("widehat") ("overline") ("overrightarrow") yuuji@70: ;; section types in mathmode yuuji@456: ("frac" 2) ("sqrt") ("mathrm") ("mathbf") ("mathit") ("mathbb") yuuji@456: ("mathscr") ("mathrsfs") yuuji@314: ;;cleveref yuuji@314: ("cref") ("crefrange") ("cpageref") ("labelcref") ("labelcpageref") yuuji@422: ;; beamer yuuji@422: ("frametitle") ("framesubtitle") yuuji@70: ) yuuji@70: (if YaTeX-use-LaTeX2e yuuji@70: '(("documentclass") ("usepackage") yuuji@70: ("textbf") ("textgt") ("textit") ("textmc") ("textmd") ("textnormal") yuuji@70: ("textrm") ("textsc") ("textsf") ("textsl") ("texttt") ("textup") yuuji@70: ("mathbf") ("mathcal") ("mathit") ("mathnormal") ("mathrm") yuuji@440: ("mathsf") ("mathtt") ("text") yuuji@82: ("textcircled") yuuji@70: ("scalebox" 1) ;is faking of argument position yuuji@82: ("rotatebox" 2) ("resizebox" 3) ("reflectbox") yuuji@82: ("colorbox" 2) ("fcolorbox" 3) ("textcolor" 2) ("color") ("pagecolor") yuuji@70: ("includegraphics") ("includegraphics*") yuuji@510: ("includesvg") yuuji@79: ("bou") ;defined in plext yuuji@79: ("url") ;defined in url yuuji@79: ("shadowbox") ("doublebox") ("ovalbox") ("Ovalbox") yuuji@79: ("fancyoval") ;defined in fancybox yuuji@79: ("keytop") ("mask" 2) ("maskbox" 5) ;defined in ascmac yuuji@79: ("bm") ;deined in bm yuuji@79: ("verbfile") ("listing") ;defined in misc yuuji@82: ("slashbox" 2) ("backslashbox" 2) ;defined in slashbox yuuji@82: )) yuuji@82: (if YaTeX-use-AMS-LaTeX yuuji@82: '(("DeclareMathOperator" 2) ("boldsymbol") ("pmb") ("eqref") yuuji@82: ("tag") ("tag*")))) yuuji@69: "Default completion table for section-type completion.") yuuji@69: yuuji@0: (defvar user-section-table nil) yuuji@6: (defvar tmp-section-table nil) yuuji@82: (defvar YaTeX-ams-math-begin-alist yuuji@82: '(("align") ("align*") ("multline") ("multline*") ("gather") ("gather*") yuuji@82: ("alignat") ("alignat*") ("xalignat") ("xalignat*") yuuji@82: ("xxalignat") ("xxalignat*") ("flalign") ("flalign*") ("equation*"))) yuuji@82: (defvar YaTeX-ams-math-gathering-alist yuuji@82: '(("matrix") ("pmatrix") ("bmatrix") ("Bmatrix") ("vmatrix") ("Vmatrix") yuuji@82: ("split") ("split*") ("aligned") ("aligned*") ("alignedat") ("gathered") yuuji@82: ("smallmatrix") ("cases") ("subequations"))) yuuji@82: ;; Prepare list(not alist) for YaTeX::ref in yatexadd.el yuuji@449: (defvar YaTeX-math-other-env-alist-default yuuji@450: '(("numcases") ("subnumcases")) yuuji@449: "Default alist of additional environments for equations") yuuji@449: (defvar YaTeX-math-other-env-alist-private nil yuuji@449: "*User defined alist of additional environments for equations") yuuji@449: (defvar YaTeX-math-other-env-alist yuuji@449: (append YaTeX-math-other-env-alist-default yuuji@449: YaTeX-math-other-env-alist-private) yuuji@449: "Alist of additional environments for equations") yuuji@450: (defvar YaTeX-math-other-env-list yuuji@450: (mapcar 'car YaTeX-math-other-env-alist)) yuuji@449: yuuji@82: (defvar YaTeX-math-begin-list yuuji@82: (mapcar 'car YaTeX-ams-math-begin-alist)) yuuji@82: (defvar YaTeX-math-gathering-list ;used in yatexadd.el#yatex::ref yuuji@82: (mapcar 'car YaTeX-ams-math-gathering-alist)) yuuji@82: yuuji@82: (defvar YaTeX-ams-env-table yuuji@82: (append YaTeX-ams-math-begin-alist YaTeX-ams-math-gathering-alist) yuuji@82: "*Standard AMS-LaTeX(2e) environment completion table.") yuuji@0: yuuji@517: (defvar YaTeX-use-dot-env-extension t yuuji@517: "*Use YaTeX's dot-env filter special environment.") yuuji@517: yuuji@0: ; Set tex-environment possible completion yuuji@22: (defvar env-table yuuji@79: (append yuuji@434: '(("quote") ("quotation") ("center") ("verse") ("document") yuuji@79: ("verbatim") ("itemize") ("enumerate") ("description") yuuji@79: ("list") ("tabular") ("tabular*") ("table") ("tabbing") ("titlepage") yuuji@79: ("sloppypar") ("picture") ("displaymath") yuuji@240: ("eqnarray") ("eqnarray*") ("figure") ("equation") ("equation*") yuuji@240: ("abstract") ("array") yuuji@79: ("thebibliography") ("theindex") ("flushleft") ("flushright") yuuji@79: ("minipage") yuuji@82: ("supertabular") yuuji@345: ("wrapfigure") ("wraptable") yuuji@424: ("frame") ("block") ("example") ("columns") ("column") ;beamer yuuji@79: ) yuuji@79: (if YaTeX-use-LaTeX2e yuuji@79: '(("comment") ;defined in version yuuji@79: ("longtable") ;defined in longtable yuuji@82: ("screen") ("boxnote") ("shadebox") ;; ("itembox") ;in ascmac yuuji@79: ("alltt") ;defined in alltt yuuji@82: ("multicols") ;defined in multicol yuuji@82: ("breakbox"))) ;defined in eclbkbox yuuji@449: (if YaTeX-use-AMS-LaTeX YaTeX-ams-env-table) yuuji@517: YaTeX-math-other-env-alist yuuji@521: (and YaTeX-use-dot-env-extension yuuji@521: (require 'yatexflt) yuuji@521: YaTeX-filter-special-env-alist)) yuuji@69: "Default completion table for begin-type completion.") yuuji@69: yuuji@0: (defvar user-env-table nil) yuuji@6: (defvar tmp-env-table nil) yuuji@0: yuuji@13: ; Set {\Large }-like completion yuuji@22: (defvar fontsize-table yuuji@22: '(("rm") ("em") ("bf") ("boldmath") ("it") ("sl") ("sf") ("sc") ("tt") yuuji@22: ("dg") ("dm") yuuji@22: ("tiny") ("scriptsize") ("footnotesize") ("small")("normalsize") yuuji@22: ("large") ("Large") ("LARGE") ("huge") ("Huge") yuuji@70: ("rmfamily") ("sffamily") ("ttfamily") yuuji@70: ("mdseries") ("bfseries") ("upshape") yuuji@70: ("itshape") ("slshape") ("scshape") yuuji@22: ) yuuji@69: "Default completion table for large-type completion.") yuuji@69: yuuji@70: (defvar LaTeX2e-fontstyle-alist yuuji@70: '(("rm" . "rmfamily") yuuji@70: ("sf" . "sffamily") yuuji@70: ("tt" . "ttfamily") yuuji@70: ("md" . "mdseries") yuuji@70: ("bf" . "bfseries") yuuji@70: ("up" . "upshape") yuuji@70: ("it" . "itshape") yuuji@70: ("sl" . "slshape") yuuji@70: ("sc" . "scshape"))) yuuji@70: yuuji@0: (defvar user-fontsize-table nil) yuuji@6: (defvar tmp-fontsize-table nil) yuuji@0: yuuji@22: (defvar singlecmd-table yuuji@51: (append yuuji@400: '(("maketitle") ("makeindex") ("sloppy") ("protect") ("par") ("and") yuuji@70: ("LaTeX") ("TeX") ("item") ("item[]") ("appendix") ("hline") ("kill") yuuji@54: ;;("rightarrow") ("Rightarrow") ("leftarrow") ("Leftarrow") yuuji@70: ("pagebreak") ("nopagebreak") ("tableofcontents") yuuji@68: ("newpage") ("clearpage") ("cleardoublepage") yuuji@51: ("footnotemark") ("verb") ("verb*") yuuji@59: ("linebreak") ("pagebreak") ("noindent") ("indent") yuuji@495: ("raggedright") ("raggedleft") ("centering") yuuji@70: ("left") ("right") ("dots") ("smallskip") ("medskip") ("bigskip") yuuji@82: ("displaystyle") yuuji@422: ("onslide") ("pause") ;beamer yuuji@51: ) yuuji@51: (if YaTeX-greek-by-maketitle-completion yuuji@51: '(("alpha") ("beta") ("gamma") ("delta") ("epsilon") yuuji@51: ("varepsilon") ("zeta") ("eta") ("theta")("vartheta") yuuji@51: ("iota") ("kappa") ("lambda") ("mu") ("nu") ("xi") ("pi") yuuji@51: ("varpi") ("rho") ("varrho") ("sigma") ("varsigma") ("tau") yuuji@51: ("upsilon") ("phi") ("varphi") ("chi") ("psi") ("omega") yuuji@51: ("Gamma") ("Delta") ("Theta") ("Lambda")("Xi") ("Pi") yuuji@79: ("Sigma") ("Upsilon") ("Phi") ("Psi") ("Omega"))) yuuji@79: (if YaTeX-use-LaTeX2e yuuji@82: '(("return") ("Return") ("yen"))) ;defined in ascmac yuuji@86: (if YaTeX-use-AMS-LaTeX yuuji@86: '(("nonumber"))) yuuji@82: ) yuuji@69: "Default completion table for maketitle-type completion.") yuuji@69: yuuji@0: (defvar user-singlecmd-table nil) yuuji@6: (defvar tmp-singlecmd-table nil) yuuji@0: yuuji@0: ;---------- Key mode map ---------- yuuji@0: ;;; yuuji@0: ;; Create new key map: YaTeX-mode-map yuuji@0: ;; Do not change this section. yuuji@0: ;;; yuuji@0: (defvar YaTeX-mode-map nil yuuji@69: "Keymap used in YaTeX mode") yuuji@69: yuuji@4: (defvar YaTeX-prefix-map nil yuuji@69: "Keymap used when YaTeX-prefix key pushed") yuuji@69: yuuji@54: (defvar YaTeX-user-extensional-map (make-sparse-keymap) yuuji@54: "*Keymap used for the user's customization") yuuji@7: (defvar YaTeX-current-completion-type nil yuuji@69: "Has current completion type. This may be used in YaTeX addin functions.") yuuji@69: yuuji@22: (defvar YaTeX-modify-mode nil yuuji@51: "*Current editing mode. yuuji@51: When non-nil, each opening parentheses only opens, yuuji@69: nil enters both open/close parentheses when opening parentheses key pressed.") yuuji@69: yuuji@22: (defvar YaTeX-math-mode nil yuuji@69: "Holds whether current mode is math-mode.") yuuji@0: ;;; yuuji@0: ;; Define key table yuuji@0: ;;; yuuji@0: (if YaTeX-mode-map yuuji@0: nil yuuji@0: (setq YaTeX-mode-map (make-sparse-keymap)) yuuji@4: (setq YaTeX-prefix-map (make-sparse-keymap)) yuuji@4: (define-key YaTeX-mode-map "\"" 'YaTeX-insert-quote) yuuji@5: (define-key YaTeX-mode-map "{" 'YaTeX-insert-braces) yuuji@22: (define-key YaTeX-mode-map "(" 'YaTeX-insert-parens) yuuji@7: (define-key YaTeX-mode-map "$" 'YaTeX-insert-dollar) yuuji@69: (define-key YaTeX-mode-map "|" 'YaTeX-insert-bar) yuuji@57: (define-key YaTeX-mode-map "&" 'YaTeX-insert-amper) yuuji@22: (define-key YaTeX-mode-map "[" 'YaTeX-insert-brackets) yuuji@4: (define-key YaTeX-mode-map YaTeX-prefix YaTeX-prefix-map) yuuji@22: (define-key YaTeX-mode-map "\M-\C-@" 'YaTeX-mark-environment) yuuji@22: (define-key YaTeX-mode-map "\M-\C-a" 'YaTeX-beginning-of-environment) yuuji@22: (define-key YaTeX-mode-map "\M-\C-e" 'YaTeX-end-of-environment) yuuji@22: (define-key YaTeX-mode-map "\M-\C-m" 'YaTeX-intelligent-newline) yuuji@32: (define-key YaTeX-mode-map "\C-i" 'YaTeX-indent-line) yuuji@13: (YaTeX-define-key "%" 'YaTeX-%-menu) yuuji@4: (YaTeX-define-key "t" 'YaTeX-typeset-menu) yuuji@11: (YaTeX-define-key "w" 'YaTeX-switch-mode-menu) yuuji@5: (YaTeX-define-key "'" 'YaTeX-prev-error) yuuji@5: (YaTeX-define-key "^" 'YaTeX-visit-main) yuuji@5: (YaTeX-define-key "4^" 'YaTeX-visit-main-other-window) yuuji@51: (YaTeX-define-key "4g" 'YaTeX-goto-corresponding-*-other-window) yuuji@53: (YaTeX-define-key "44" 'YaTeX-switch-to-window) yuuji@53: (and YaTeX-emacs-19 window-system yuuji@53: (progn yuuji@53: (YaTeX-define-key "5^" 'YaTeX-visit-main-other-frame) yuuji@53: (YaTeX-define-key "5g" 'YaTeX-goto-corresponding-*-other-frame) yuuji@53: (YaTeX-define-key "55" 'YaTeX-switch-to-window))) yuuji@5: (YaTeX-define-key " " 'YaTeX-do-completion) yuuji@4: (YaTeX-define-key "v" 'YaTeX-version) yuuji@0: yuuji@5: (YaTeX-define-key "}" 'YaTeX-insert-braces-region) yuuji@5: (YaTeX-define-key "]" 'YaTeX-insert-brackets-region) yuuji@11: (YaTeX-define-key ")" 'YaTeX-insert-parens-region) yuuji@11: (YaTeX-define-key "$" 'YaTeX-insert-dollars-region) yuuji@5: (YaTeX-define-key "i" 'YaTeX-fill-item) yuuji@165: (YaTeX-define-key "\\" yuuji@353: (function(lambda () (interactive) yuuji@353: (insert (if (YaTeX-in-math-mode-p) "\\backslash" "\\textbackslash"))))) yuuji@22: (if YaTeX-no-begend-shortcut yuuji@22: (progn yuuji@22: (YaTeX-define-key "B" 'YaTeX-make-begin-end-region) yuuji@22: (YaTeX-define-key "b" 'YaTeX-make-begin-end)) yuuji@22: (YaTeX-define-begend-key "bc" "center") yuuji@22: (YaTeX-define-begend-key "bd" "document") yuuji@22: (YaTeX-define-begend-key "bD" "description") yuuji@22: (YaTeX-define-begend-key "be" "enumerate") yuuji@22: (YaTeX-define-begend-key "bE" "equation") yuuji@22: (YaTeX-define-begend-key "bi" "itemize") yuuji@22: (YaTeX-define-begend-key "bl" "flushleft") yuuji@22: (YaTeX-define-begend-key "bm" "minipage") yuuji@22: (YaTeX-define-begend-key "bt" "tabbing") yuuji@22: (YaTeX-define-begend-key "bT" "tabular") yuuji@22: (YaTeX-define-begend-key "b\^t" "table") yuuji@22: (YaTeX-define-begend-key "bp" "picture") yuuji@22: (YaTeX-define-begend-key "bq" "quote") yuuji@22: (YaTeX-define-begend-key "bQ" "quotation") yuuji@22: (YaTeX-define-begend-key "br" "flushright") yuuji@22: (YaTeX-define-begend-key "bv" "verbatim") yuuji@22: (YaTeX-define-begend-key "bV" "verse") yuuji@22: (YaTeX-define-key "B " 'YaTeX-make-begin-end-region) yuuji@22: (YaTeX-define-key "b " 'YaTeX-make-begin-end)) yuuji@4: (YaTeX-define-key "e" 'YaTeX-end-environment) yuuji@14: (YaTeX-define-key "S" 'YaTeX-make-section-region) yuuji@4: (YaTeX-define-key "s" 'YaTeX-make-section) yuuji@4: (YaTeX-define-key "L" 'YaTeX-make-fontsize-region) yuuji@4: (YaTeX-define-key "l" 'YaTeX-make-fontsize) yuuji@4: (YaTeX-define-key "m" 'YaTeX-make-singlecmd) yuuji@22: (YaTeX-define-key "." 'YaTeX-comment-paragraph) yuuji@22: (YaTeX-define-key "," 'YaTeX-uncomment-paragraph) yuuji@22: (YaTeX-define-key ">" 'YaTeX-comment-region) yuuji@22: (YaTeX-define-key "<" 'YaTeX-uncomment-region) yuuji@5: (YaTeX-define-key "g" 'YaTeX-goto-corresponding-*) yuuji@5: (YaTeX-define-key "k" 'YaTeX-kill-*) yuuji@5: (YaTeX-define-key "c" 'YaTeX-change-*) yuuji@5: (YaTeX-define-key "a" 'YaTeX-make-accent) yuuji@16: (YaTeX-define-key "?" 'YaTeX-help) yuuji@22: (YaTeX-define-key "/" 'YaTeX-apropos) yuuji@22: (YaTeX-define-key "&" 'YaTeX-what-column) yuuji@52: (YaTeX-define-key "d" 'YaTeX-display-hierarchy) yuuji@54: (YaTeX-define-key "x" YaTeX-user-extensional-map) yuuji@5: (YaTeX-define-key "n" yuuji@353: (function(lambda () (interactive) yuuji@353: (insert "\\" (if (YaTeX-on-section-command-p "o?oalign") "crcr" "\\"))))) yuuji@13: (if YaTeX-dos yuuji@7: (define-key YaTeX-prefix-map "\C-r" yuuji@353: (function(lambda () (interactive) yuuji@353: (YaTeX-set-screen-height YaTeX-saved-screen-height) (recenter)))))) yuuji@0: yuuji@49: (defvar YaTeX-section-completion-map nil yuuji@22: "*Key map used at YaTeX completion in the minibuffer.") yuuji@49: (if YaTeX-section-completion-map nil yuuji@49: (setq YaTeX-section-completion-map yuuji@22: (copy-keymap (or (and (boundp 'gmhist-completion-map) yuuji@22: gmhist-completion-map) yuuji@22: minibuffer-local-completion-map))) yuuji@49: (define-key YaTeX-section-completion-map yuuji@22: " " 'YaTeX-minibuffer-complete) yuuji@49: (define-key YaTeX-section-completion-map yuuji@22: "\C-i" 'YaTeX-minibuffer-complete) yuuji@49: (define-key YaTeX-section-completion-map yuuji@22: "\C-v" 'YaTeX-read-section-with-overview)) yuuji@22: yuuji@14: (defvar YaTeX-recursive-map nil yuuji@22: "*Key map used at YaTeX reading arguments in the minibuffer.") yuuji@14: (if YaTeX-recursive-map nil yuuji@14: (setq YaTeX-recursive-map (copy-keymap global-map)) yuuji@82: (define-key YaTeX-recursive-map YaTeX-prefix YaTeX-prefix-map) yuuji@82: (mapcar yuuji@82: (function yuuji@82: (lambda (key) yuuji@82: (define-key YaTeX-mode-map (car key) 'YaTeX-math-insert-sequence) yuuji@82: (define-key YaTeX-recursive-map (car key) 'YaTeX-math-insert-sequence))) yuuji@82: YaTeX-math-key-list)) yuuji@0: ;---------- Define other variable ---------- yuuji@72: (defvar YaTeX-env-name "document" "*Initial tex-environment completion") yuuji@72: (defvar YaTeX-section-name yuuji@72: (if YaTeX-use-LaTeX2e "documentclass" "documentstyle") yuuji@72: "*Initial tex-section completion") yuuji@72: (defvar YaTeX-fontsize-name "large" "*Initial fontsize completion") yuuji@72: (defvar YaTeX-single-command "maketitle" "*Initial LaTeX single command") yuuji@469: (defvar YaTeX-kanji-code nil yuuji@79: "*File kanji code used by Japanese TeX. yuuji@79: nil: Do not care (Preserve coding-system) yuuji@512: 0: no-conversion (mule) yuuji@79: 1: Shift JIS yuuji@79: 2: JIS yuuji@86: 3: EUC yuuji@86: 4: UTF-8") yuuji@69: yuuji@22: (defvar YaTeX-coding-system nil "File coding system used by Japanese TeX.") yuuji@5: (cond yuuji@64: (YaTeX-emacs-20 yuuji@64: (setq YaTeX-coding-system yuuji@64: (cdr (assoc YaTeX-kanji-code YaTeX-kanji-code-alist)))) yuuji@5: ((boundp 'MULE) yuuji@22: (setq YaTeX-coding-system yuuji@79: (symbol-value (cdr (assoc YaTeX-kanji-code YaTeX-kanji-code-alist)))))) yuuji@64: yuuji@64: (defvar YaTeX-mode-syntax-table nil yuuji@64: "*Syntax table for yatex-mode") yuuji@64: yuuji@64: (if YaTeX-mode-syntax-table nil yuuji@64: (setq YaTeX-mode-syntax-table (make-syntax-table (standard-syntax-table))) yuuji@64: (modify-syntax-entry ?\n " " YaTeX-mode-syntax-table) yuuji@68: (modify-syntax-entry ?\{ "(}" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?\} "){" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?\t " " YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?\f ">" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?\n ">" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?$ "$$" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?% "<" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?\\ "/" YaTeX-mode-syntax-table) yuuji@70: (modify-syntax-entry ?~ " " YaTeX-mode-syntax-table)) yuuji@52: yuuji@414: (defvar YaTeX-mode-syntax-table-nonparen nil yuuji@414: "Syntax table for yatex-mode with normal parentheses treated white spaces") yuuji@414: (if YaTeX-mode-syntax-table-nonparen nil yuuji@414: (setq YaTeX-mode-syntax-table-nonparen yuuji@414: (make-syntax-table YaTeX-mode-syntax-table)) yuuji@416: (let ((zenparens "()()「」『』【】[]{}《》〈〉〔〕") (i 0) s) yuuji@414: (while (string-match "." zenparens i) yuuji@414: (setq s (substring zenparens (match-beginning 0) (match-end 0)) yuuji@414: i (1+ i)) yuuji@414: (modify-syntax-entry yuuji@414: (string-to-char s) " " YaTeX-mode-syntax-table-nonparen)))) yuuji@414: yuuji@14: ;---------- Provide YaTeX-mode ---------- yuuji@0: ;;; yuuji@0: ;; Major mode definition yuuji@0: ;;; yuuji@0: (defun yatex-mode () yuuji@7: " Yet Another LaTeX mode: Major mode for editing input files of LaTeX. yuuji@13: -You can invoke processes concerning LaTeX typesetting by yuuji@7: \\[YaTeX-typeset-menu] yuuji@22: -Complete LaTeX environment form of `\\begin{env} ... \\end{env}' by yuuji@7: \\[YaTeX-make-begin-end] yuuji@7: -Enclose region into some environment by yuuji@7: \\[universal-argument] \\[YaTeX-make-begin-end] yuuji@7: -Complete LaTeX command which takes argument like `\\section{}' by yuuji@7: \\[YaTeX-make-section] yuuji@7: -Put LaTeX command which takes no arguments like `\\maketitle' by yuuji@7: \\[YaTeX-make-singlecmd] yuuji@7: -Complete font or character size descriptor like `{\\large }' by yuuji@7: \\[YaTeX-make-fontsize] yuuji@22: -Enclose region into those descriptors above by yuuji@7: \\[universal-argument] \\[YaTeX-make-fontsize] yuuji@54: -Enter European accent notations by yuuji@7: \\[YaTeX-make-accent] yuuji@13: -Toggle various modes of YaTeX by yuuji@13: \\[YaTeX-switch-mode-menu] yuuji@22: -Change environt name (on the begin/end line) by yuuji@22: \\[YaTeX-change-*] yuuji@22: -Kill LaTeX command/environment sequences by yuuji@22: \\[YaTeX-kill-*] yuuji@22: -Kill LaTeX command/environment with its contents yuuji@22: \\[universal-argument] \\[YaTeX-kill-*] yuuji@22: -Go to corresponding object (begin/end, file, labels) by yuuji@54: \\[YaTeX-goto-corresponding-*] or yuuji@54: \\[YaTeX-goto-corresponding-*-other-window] (in other window) yuuji@54: \\[YaTeX-goto-corresponding-*-other-frame] (in other frame) yuuji@22: -Go to main LaTeX source text by yuuji@54: \\[YaTeX-visit-main] or yuuji@54: \\[YaTeX-visit-main-other-window] (in other window) yuuji@54: \\[YaTeX-visit-main-other-frame] (in other frame) yuuji@22: -Comment out or uncomment region by yuuji@22: \\[YaTeX-comment-region] or \\[YaTeX-uncomment-region] yuuji@22: -Comment out or uncomment paragraph by yuuji@22: \\[YaTeX-comment-paragraph] or \\[YaTeX-uncomment-paragraph] yuuji@22: -Make an \\item entry hang-indented by yuuji@22: \\[YaTeX-fill-item] yuuji@22: -Enclose the region with parentheses by yuuji@22: \\[YaTeX-insert-parens-region] yuuji@22: \\[YaTeX-insert-braces-region] yuuji@22: \\[YaTeX-insert-brackets-region] yuuji@22: \\[YaTeX-insert-dollars-region] yuuji@22: -Look up the corresponding column header of tabular environment by yuuji@22: \\[YaTeX-what-column] yuuji@54: -Enter a newline and an entry suitable for environment by yuuji@54: \\[YaTeX-intelligent-newline] yuuji@54: -View the structure of file inclusion by yuuji@54: \\[YaTeX-display-hierarchy] yuuji@22: -Refer the online help of popular LaTeX commands by yuuji@54: \\[YaTeX-help] (help) yuuji@54: \\[YaTeX-apropos] (apropos) yuuji@13: -Edit `%# notation' by yuuji@13: \\[YaTeX-%-menu] yuuji@7: yuuji@7: Those are enough for fastening your editing of LaTeX source. But further yuuji@22: more features are available and they are documented in the manual. yuuji@22: " yuuji@0: (interactive) yuuji@0: (kill-all-local-variables) yuuji@7: (setq major-mode 'yatex-mode) yuuji@55: (setq mode-name (if YaTeX-japan "やてふ" "YaTeX")) yuuji@18: (mapcar 'make-local-variable yuuji@52: '(dvi2-command fill-column fill-prefix yuuji@18: tmp-env-table tmp-section-table tmp-fontsize-table yuuji@52: tmp-singlecmd-table paragraph-start paragraph-separate yuuji@77: YaTeX-math-mode indent-line-function comment-line-break-function yuuji@58: comment-start comment-start-skip yuuji@22: )) yuuji@354: (YaTeX-set-file-coding-system YaTeX-kanji-code YaTeX-coding-system) yuuji@5: (setq fill-column YaTeX-fill-column yuuji@7: fill-prefix YaTeX-fill-prefix yuuji@58: paragraph-start YaTeX-paragraph-start yuuji@58: paragraph-separate YaTeX-paragraph-separate yuuji@52: indent-line-function 'YaTeX-indent-line yuuji@58: comment-start YaTeX-comment-prefix yuuji@60: comment-end "" yuuji@70: comment-start-skip "[^\\\\]%+[ \t]*" yuuji@73: local-abbrev-table yatex-mode-abbrev-table) yuuji@77: (if (fboundp 'comment-indent-new-line) ;for Emacs21 yuuji@77: (setq comment-line-break-function 'YaTeX-comment-line-break)) yuuji@330: ;; +dnd for X11 w/ emacs23+ yuuji@330: (and window-system (featurep 'dnd) (require 'yatex23 nil t) yuuji@330: (set (make-local-variable 'dnd-protocol-alist) yuuji@330: (cons (cons "^file:" 'YaTeX-dnd-handler) dnd-protocol-alist))) yuuji@77: yuuji@72: (if (and YaTeX-use-font-lock (featurep 'font-lock)) yuuji@72: (progn yuuji@77: (require 'yatex19) yuuji@72: (YaTeX-font-lock-set-default-keywords) yuuji@72: (or (featurep 'xemacs) yuuji@72: (set (make-local-variable 'font-lock-defaults) yuuji@72: (get 'yatex-mode 'font-lock-defaults))) yuuji@72: ;;(font-lock-mode 1) yuuji@72: )) yuuji@0: (use-local-map YaTeX-mode-map) yuuji@64: (set-syntax-table YaTeX-mode-syntax-table) yuuji@182: (if YaTeX-dos (setq YaTeX-saved-screen-height (YaTeX-screen-height))) yuuji@6: (YaTeX-read-user-completion-table) yuuji@73: (and (fboundp 'YaTeX-hilit-setup-alist) (YaTeX-hilit-setup-alist)) yuuji@70: (makunbound 'inenv) yuuji@409: ;(turn-on-auto-fill) ;1.63 -> 1.79off yuuji@409: (if (fboundp 'electric-indent-local-mode) yuuji@409: (electric-indent-local-mode YaTeX-electric-indent-mode)) yuuji@64: (and (= 0 (buffer-size)) (file-exists-p YaTeX-template-file) yuuji@64: (y-or-n-p (format "Insert %s?" YaTeX-template-file)) yuuji@64: (insert-file-contents (expand-file-name YaTeX-template-file))) yuuji@69: (run-hooks 'text-mode-hook 'yatex-mode-hook)) yuuji@5: yuuji@0: ;---------- Define YaTeX-mode functions ---------- yuuji@13: (defvar YaTeX-ec "\\" "Escape character of current mark-up language.") yuuji@22: (defvar YaTeX-ec-regexp (regexp-quote YaTeX-ec)) yuuji@13: (defvar YaTeX-struct-begin yuuji@13: (concat YaTeX-ec "begin{%1}%2") yuuji@64: "Keyword format of begin-environment.") yuuji@64: (defvar YaTeX-struct-end yuuji@64: (concat YaTeX-ec "end{%1}") yuuji@64: "Keyword format of end-environment.") yuuji@217: (defvar YaTeX-struct-name-regexp "[^}]*" yuuji@13: "Environment name regexp.") yuuji@22: (defvar YaTeX-TeX-token-regexp yuuji@82: (cond (YaTeX-japan "[A-Za-z*ぁ-ん亜-龠]+") yuuji@22: (t "[A-Za-z*]+")) yuuji@22: "Regexp of characters which can be a member of TeX command's name.") yuuji@82: (defvar YaTeX-kanji-regexp "[ぁ-ん亜-龠]" yuuji@82: "Generic regexp of Japanese Kanji (and symbol) characters.") yuuji@32: (defvar YaTeX-command-token-regexp YaTeX-TeX-token-regexp yuuji@51: "Regexp of characters which can be a member of current mark up language's command name.") yuuji@49: yuuji@13: ;;(defvar YaTeX-struct-section yuuji@13: ;; (concat YaTeX-ec "%1{%2}") yuuji@13: ;; "Keyword to make section.") yuuji@13: yuuji@0: ;;; yuuji@22: ;; autoload section yuuji@22: ;;; yuuji@22: yuuji@22: ;;autoload from yatexprc.el yuuji@22: (autoload 'YaTeX-visit-main "yatexprc" "Visit main LaTeX file." t) yuuji@22: (autoload 'YaTeX-visit-main-other-window "yatexprc" yuuji@52: "Visit main other window." t) yuuji@53: (autoload 'YaTeX-main-file-p "yatexprc" "Check if the file is main." t) yuuji@51: (autoload 'YaTeX-get-builtin "yatexprc" "Get %# built-in." t) yuuji@59: (autoload 'YaTeX-system "yatexprc" "Call system command" t) yuuji@60: (autoload 'YaTeX-save-buffers "yatexprc" "Save buffers of same major mode" t) yuuji@350: (autoload 'YaTeX-goto-corresponding-viewer "yatexprc" "Viewer jump line" t) yuuji@22: yuuji@22: ;;autoload from yatexmth.el yuuji@22: (autoload 'YaTeX-math-insert-sequence "yatexmth" "Image input." t) yuuji@22: (autoload 'YaTeX-in-math-mode-p "yatexmth" "Check if in math-env." t) yuuji@22: (autoload 'YaTeX-toggle-math-mode "yatexmth" "YaTeX math-mode interfaces." t) yuuji@52: (autoload 'YaTeX-math-member-p "yatexmth" "Check if a word is math command." t) yuuji@69: (autoload 'YaTeX-insert-amsparens-region "yatexmth" "AMS parens region" t) yuuji@69: (autoload 'YaTeX-insert-amsbraces-region "yatexmth" "AMS braces region" t) yuuji@69: (autoload 'YaTeX-insert-amsbrackets-region "yatexmth" "AMS brackets region" t) yuuji@69: (autoload 'YaTeX-on-parenthesis-p "yatexmth" "Check if on math-parens" t) yuuji@69: (autoload 'YaTeX-goto-open-paren "yatexmth" "Goto opening paren" t) yuuji@69: (autoload 'YaTeX-change-parentheses "yatexmth" "Change corresponding parens" t) yuuji@77: (autoload 'YaTeX-goto-corresponding-paren "yatexmth" "\bigl\bigr jumps" t) yuuji@130: (autoload 'YaTeX-typeset-math-region "yatexmth" "Typeset math-region" t) yuuji@22: yuuji@22: ;;autoload from yatexhlp.el yuuji@22: (autoload 'YaTeX-help "yatexhlp" "YaTeX helper with LaTeX commands." t) yuuji@22: (autoload 'YaTeX-apropos "yatexhlp" "Apropos for (La)TeX commands." t) yuuji@22: yuuji@22: ;;autoload from yatexgen.el yuuji@22: (autoload 'YaTeX-generate "yatexgen" "YaTeX add-in function generator." t) yuuji@22: (autoload 'YaTeX-generate-simple "yatexgen" "YaTeX add-in support." t) yuuji@22: yuuji@22: ;;autoload from yatexsec.el yuuji@69: (autoload 'YaTeX-section-overview "yatexsec" "YaTeX sectioning(view)" t) yuuji@22: (autoload 'YaTeX-read-section-in-minibuffer "yatexsec" "YaTeX sectioning" t) yuuji@22: (autoload 'YaTeX-make-section-with-overview "yatexsec" "YaTeX sectioning" t) yuuji@22: yuuji@22: ;;autoload from yatexenv.el yuuji@22: (autoload 'YaTeX-what-column "yatexenv" "YaTeX env. specific funcs" t) yuuji@22: (autoload 'YaTeX-intelligent-newline "yatexenv" "YaTeX env. specific funcs" t) yuuji@53: (autoload 'YaTeX-indent-line-equation "yatexenv" "Indent equation lines." t) yuuji@53: (autoload 'YaTeX-goto-corresponding-leftright "yatexenv" "\left\right jumps" t) yuuji@22: yuuji@52: ;;autoload from yatexhie.el yuuji@52: (autoload 'YaTeX-display-hierarchy "yatexhie" yuuji@52: "YaTeX document hierarchy browser" t) yuuji@61: (autoload 'YaTeX-display-hierarchy-directly "yatexhie" yuuji@61: "Same as YaTeX-display-hierarchy. Call from mouse." t) yuuji@52: yuuji@79: ;;autoload from yatexpkg.el yuuji@79: (autoload 'YaTeX-package-auto-usepackage "yatexpkg" "Auto \\usepackage" t) yuuji@60: yuuji@22: ;;; yuuji@0: ;; YaTeX-mode functions yuuji@0: ;;; yuuji@22: (defun YaTeX-insert-begin-end (env region-mode) yuuji@45: "Insert \\begin{mode-name} and \\end{mode-name}. yuuji@22: This works also for other defined begin/end tokens to define the structure." yuuji@7: (setq YaTeX-current-completion-type 'begin) yuuji@58: (let*((ccol (current-column)) beg beg2 exchange yuuji@22: (arg region-mode) ;for old compatibility yuuji@58: (indent-column (+ ccol YaTeX-environment-indent))(i 1) func) yuuji@22: (if (and region-mode (> (point) (mark))) yuuji@16: (progn (exchange-point-and-mark) yuuji@16: (setq exchange t yuuji@16: ccol (current-column) yuuji@16: indent-column (+ ccol YaTeX-environment-indent)))) yuuji@16: ;;VER2 (insert "\\begin{" env "}" (YaTeX-addin env)) yuuji@16: (setq beg (point)) yuuji@16: (YaTeX-insert-struc 'begin env) yuuji@58: (setq beg2 (point)) yuuji@16: (insert "\n") yuuji@16: (indent-to indent-column) yuuji@16: (save-excursion yuuji@16: ;;indent optional argument of \begin{env}, if any yuuji@16: (while (> (point-beginning-of-line) beg) yuuji@16: (skip-chars-forward "\\s " (point-end-of-line)) yuuji@16: (indent-to indent-column) yuuji@16: (forward-line -1))) yuuji@58: (require 'yatexenv) yuuji@22: (if region-mode yuuji@16: ;;if region-mode, indent all text in the region yuuji@7: (save-excursion yuuji@53: (if (fboundp (intern-soft (concat "YaTeX-enclose-" env))) yuuji@53: (funcall (intern-soft (concat "YaTeX-enclose-" env)) yuuji@53: (point) (mark)) yuuji@53: (while (< (progn (forward-line 1) (point)) (mark)) yuuji@53: (if (eolp) nil yuuji@53: (skip-chars-forward " \t\n") yuuji@58: (indent-to indent-column)))))) yuuji@22: (if region-mode (exchange-point-and-mark)) yuuji@16: (indent-to ccol) yuuji@16: ;;VER2 (insert "\\end{" env "}\n") yuuji@16: (YaTeX-insert-struc 'end env) yuuji@58: (YaTeX-reindent ccol) yuuji@22: (if region-mode yuuji@16: (progn yuuji@54: (insert "\n") yuuji@16: (or exchange (exchange-point-and-mark))) yuuji@58: (goto-char beg2) yuuji@215: (YaTeX-intelligent-newline nil) yuuji@218: (if (fboundp (intern-soft (concat "YaTeX-intelligent-newline-" env))) yuuji@194: (progn yuuji@194: (message yuuji@194: (cond yuuji@194: (YaTeX-japan "%s で次の行の入力に進みます。") yuuji@194: (t "`%s' produces the next line's template.")) yuuji@194: (key-description yuuji@194: (car (where-is-internal 'YaTeX-intelligent-newline)))))) yuuji@64: (YaTeX-indent-line)) yuuji@79: (YaTeX-package-auto-usepackage env 'env) yuuji@5: (if YaTeX-current-position-register yuuji@69: (point-to-register YaTeX-current-position-register)))) yuuji@0: yuuji@0: (defun YaTeX-make-begin-end (arg) yuuji@0: "Make LaTeX environment command of \\begin{env.} ... \\end{env.} yuuji@0: by completing read. yuuji@0: If you invoke this command with universal argument, yuuji@5: \(key binding for universal-argument is \\[universal-argument]\) yuuji@517: you can put REGION into that environment between \\begin and \\end. yuuji@517: If the environment name begins with `.'(dot), yuuji@517: that environment will be treated as `special environment', which yuuji@517: enables special feature such as text conversion." yuuji@0: (interactive "P") yuuji@0: (let* yuuji@392: ((region-p (or arg (YaTeX-region-active-p))) yuuji@392: (mode (if region-p " region" "")) yuuji@0: (env yuuji@392: (save-excursion ;for Emacs24 work-around to avoid point warp yuuji@392: (YaTeX-read-environment yuuji@517: (format "Begin environment%s(default %s): " mode YaTeX-env-name)))) yuuji@517: special) yuuji@0: (if (string= env "") yuuji@72: (setq env YaTeX-env-name)) yuuji@517: (setq special (assoc env YaTeX-filter-special-env-alist) yuuji@517: YaTeX-env-name env) yuuji@7: (YaTeX-update-table yuuji@72: (list YaTeX-env-name) 'env-table 'user-env-table 'tmp-env-table) yuuji@517: (if special yuuji@517: (YaTeX-insert-filter-special YaTeX-env-name (cdr special) region-p) yuuji@517: (YaTeX-insert-begin-end YaTeX-env-name region-p)))) yuuji@0: yuuji@0: (defun YaTeX-make-begin-end-region () yuuji@0: "Call YaTeX-make-begin-end with ARG to specify region mode." yuuji@0: (interactive) yuuji@69: (YaTeX-make-begin-end t)) yuuji@0: yuuji@72: (defun YaTeX-guess-section-type () yuuji@72: (if (eq major-mode 'yatex-mode) yuuji@72: (save-excursion yuuji@72: (cond yuuji@72: ((save-excursion (not (search-backward YaTeX-ec nil t))) yuuji@72: (if YaTeX-use-LaTeX2e "documentclass" "documentstyle")) yuuji@79: ((progn yuuji@79: (if (= (char-after (1- (point))) ?~) (forward-char -1)) yuuji@82: (forward-char -1) (looking-at "表\\|図\\|式\\|第")) yuuji@72: "ref") yuuji@72: ((and (looking-at "[a-z \t]") yuuji@72: (progn (skip-chars-backward "a-z \t") yuuji@314: (looking-at "table\\|figure\\|formula\\|eq\\(\\.\\|uation\\)"))) yuuji@72: "ref") yuuji@72: ((save-excursion yuuji@72: (skip-chars-backward "[^ア-ン]") yuuji@72: (looking-at "プログラム\\|リスト")) yuuji@72: "ref") yuuji@72: ((YaTeX-re-search-active-backward yuuji@72: (concat YaTeX-ec-regexp "begin{\\([^}]+\\)}") yuuji@72: (regexp-quote YaTeX-comment-prefix) yuuji@72: (save-excursion (forward-line -1) (point)) yuuji@72: t) yuuji@72: (let ((env (YaTeX-match-string 1))) yuuji@72: (cdr (assoc env yuuji@72: '(("table" . "caption")))))) yuuji@72: )))) yuuji@72: yuuji@46: (defun YaTeX-make-section (arg &optional beg end cmd) yuuji@0: "Make LaTeX \\section{} type command with completing read. yuuji@13: With numeric ARG, you can specify the number of arguments of yuuji@0: LaTeX command. yuuji@0: For example, if you want to produce LaTeX command yuuji@0: yuuji@0: \\addtolength{\\topmargin}{8mm} yuuji@0: yuuji@5: which has two arguments. You can produce that sequence by typing... yuuji@0: ESC 2 C-c s add SPC RET \\topm SPC RET 8mm RET yuuji@0: \(by default\) yuuji@13: Then yatex will automatically complete `addtolength' with two arguments yuuji@6: next time. yuuji@14: You can complete symbol at LaTeX command and the 1st argument. yuuji@14: yuuji@14: If the optional 2nd and 3rd argument BEG END are specified, enclose yuuji@46: the region from BEG to END into the first argument of the LaTeX sequence. yuuji@46: Optional 4th arg CMD is LaTeX command name, for non-interactive use." yuuji@6: (interactive "P") yuuji@7: (setq YaTeX-current-completion-type 'section) yuuji@392: (if (or (equal arg '(4)) (YaTeX-region-active-p)) yuuji@392: (setq beg (region-beginning) end (region-end))) yuuji@14: (unwind-protect yuuji@14: (let* yuuji@22: ((source-window (selected-window)) yuuji@72: guess yuuji@22: (section yuuji@46: (or cmd yuuji@72: (progn yuuji@72: (setq guess yuuji@72: (or (YaTeX-guess-section-type) YaTeX-section-name)) yuuji@72: (YaTeX-read-section yuuji@72: (if YaTeX-simple-messages yuuji@72: (format "Section-type (default %s): " guess) yuuji@72: (if (> (minibuffer-depth) 0) yuuji@72: (format "%s???{} (default %s)%s: " yuuji@72: YaTeX-ec guess yuuji@72: (format "[level:%d]" (minibuffer-depth))) yuuji@72: (format "(C-v for view-section) %s???{%s} (default %s): " yuuji@72: YaTeX-ec (if beg "region" "") guess))) yuuji@72: nil)))) yuuji@72: (section (if (string= section "") guess section)) yuuji@14: (numarg ;; The number of section-type command's argument yuuji@68: (or (and (numberp arg) arg) yuuji@51: (nth 1 (YaTeX-lookup-table section 'section)) yuuji@14: 1)) yuuji@14: (arg-reader (intern-soft (concat "YaTeX::" section))) yuuji@14: (addin-args (and arg-reader (fboundp arg-reader))) yuuji@14: (title "") yuuji@54: (j 1) yuuji@72: (after-change-functions nil) ;inhibit font-locking temporarily yuuji@82: (enable-recursive-minibuffers t) yuuji@82: (mkarg-func yuuji@82: (function yuuji@82: (lambda (n) yuuji@82: (while (<= j n) yuuji@216: (unwind-protect yuuji@216: (setq title yuuji@216: (cond yuuji@216: (addin-args (funcall arg-reader j)) yuuji@216: (YaTeX-skip-default-reader "") yuuji@216: (t yuuji@394: (read-string-with-history yuuji@216: (format "Argument %d of %s: " j section))))) yuuji@216: (insert yuuji@216: (concat ;to allow nil return value yuuji@216: "{" title "}"))) yuuji@82: (setq j (1+ j)))))) yuuji@82: );;let yuuji@72: (setq YaTeX-section-name section) yuuji@14: (if beg yuuji@79: (let*((e (make-marker)) yuuji@79: (ar2 (intern-soft (concat "YaTeX::" section "-region"))) yuuji@79: (arp (and ar2 (fboundp ar2)))) yuuji@14: (goto-char end) yuuji@14: (insert "}") yuuji@14: (set-marker e (point)) yuuji@14: (goto-char beg) yuuji@216: (unwind-protect yuuji@216: (progn yuuji@216: (insert YaTeX-ec YaTeX-section-name yuuji@216: (YaTeX-addin YaTeX-section-name)) yuuji@216: (if (> numarg 1) (funcall mkarg-func (1- numarg)))) yuuji@216: (insert "{")) yuuji@79: (if arp (funcall ar2 (point) e)) yuuji@68: (goto-char e) yuuji@68: (set-marker e nil)) yuuji@14: (use-global-map YaTeX-recursive-map) yuuji@72: (if (= numarg 0) (YaTeX-make-singlecmd YaTeX-section-name) yuuji@72: (progn (insert YaTeX-ec YaTeX-section-name) yuuji@72: (insert (YaTeX-addin YaTeX-section-name)))) yuuji@82: ;;read arguments with add-in yuuji@82: (funcall mkarg-func numarg)) yuuji@14: (YaTeX-update-table yuuji@14: (if (/= numarg 1) (list section numarg) yuuji@14: (list section)) yuuji@14: 'section-table 'user-section-table 'tmp-section-table) yuuji@14: (if YaTeX-current-position-register yuuji@14: (point-to-register YaTeX-current-position-register)) yuuji@165: (if (string= (YaTeX-buffer-substring (- (point) 2) (point)) yuuji@165: "{}") yuuji@165: (forward-char -1)) yuuji@165: (while (string= (YaTeX-buffer-substring (- (point) 3) (1- (point))) yuuji@165: "{}") yuuji@79: (forward-char -2)) yuuji@79: (YaTeX-package-auto-usepackage section 'section)) yuuji@72: (if (<= (minibuffer-depth) 0) (use-global-map global-map)) yuuji@72: (insert ""))) ;insert dummy string to fontify(Emacs20) yuuji@0: yuuji@14: (defun YaTeX-make-section-region (args beg end) yuuji@14: "Call YaTeX-make-section with arguments to specify region mode." yuuji@14: (interactive "P\nr") yuuji@69: (YaTeX-make-section args beg end)) yuuji@0: yuuji@54: (defun YaTeX-make-fontsize (arg &optional fontsize) yuuji@0: "Make completion like {\\large ...} or {\\slant ...} in minibuffer. yuuji@0: If you invoke this command with universal argument, you can put region yuuji@0: into {\\xxx } braces. yuuji@5: \(key binding for universal-argument is \\[universal-argument]\)" yuuji@0: (interactive "P") yuuji@49: (YaTeX-sync-local-table 'tmp-fontsize-table) yuuji@392: (let* ((region-p (if (or arg (YaTeX-region-active-p)) yuuji@392: (cons (region-beginning) (region-end)))) yuuji@392: (mode (if region-p "region" "")) yuuji@0: (fontsize yuuji@54: (or fontsize yuuji@54: (YaTeX-read-fontsize yuuji@54: (if YaTeX-simple-messages yuuji@72: (format "Font or size (default %s): " YaTeX-fontsize-name) yuuji@72: (format "{\\??? %s} (default %s)%s: " mode YaTeX-fontsize-name yuuji@54: (if (> (minibuffer-depth) 0) yuuji@54: (format "[level:%d]" (minibuffer-depth)) ""))) yuuji@54: nil nil)))) yuuji@0: (if (string= fontsize "") yuuji@72: (setq fontsize YaTeX-fontsize-name)) yuuji@68: (setq YaTeX-current-completion-type 'large) yuuji@72: (setq YaTeX-fontsize-name fontsize) yuuji@6: (YaTeX-update-table yuuji@72: (list YaTeX-fontsize-name) yuuji@6: 'fontsize-table 'user-fontsize-table 'tmp-fontsize-table) yuuji@70: (and YaTeX-use-LaTeX2e yuuji@70: (YaTeX-latex2e-p) yuuji@72: (setq fontsize yuuji@72: (cdr (assoc YaTeX-fontsize-name LaTeX2e-fontstyle-alist))) yuuji@72: (setq YaTeX-fontsize-name fontsize)) yuuji@392: (if region-p yuuji@392: (let ((b (car region-p)) yuuji@392: (e (set-marker (make-marker) (cdr region-p)))) yuuji@392: (goto-char b) yuuji@72: (insert "{\\" YaTeX-fontsize-name " ") yuuji@392: (goto-char e) yuuji@392: (insert "}") yuuji@392: (set-marker e nil)) yuuji@72: (insert (concat "{\\" YaTeX-fontsize-name " }")) yuuji@72: (forward-char -1) yuuji@5: (if YaTeX-current-position-register yuuji@5: (point-to-register YaTeX-current-position-register)) yuuji@68: (save-excursion yuuji@79: (insert (YaTeX-addin YaTeX-fontsize-name))) yuuji@79: (YaTeX-package-auto-usepackage YaTeX-fontsize-name 'large)))) yuuji@0: yuuji@0: (defun YaTeX-make-fontsize-region () yuuji@5: "Call function:YaTeX-make-fontsize with ARG to specify region mode." yuuji@0: (interactive) yuuji@69: (YaTeX-make-fontsize t)) yuuji@0: yuuji@52: (defvar YaTeX-singlecmd-suffix "" "*Suffix for maketitle-type commands.") yuuji@51: (defvar YaTeX-read-singlecmd-history nil "Holds maketitle-type history.") yuuji@51: (put 'YaTeX-read-singlecmd-history 'no-default t) yuuji@0: (defun YaTeX-make-singlecmd (single) yuuji@0: (interactive yuuji@49: (list (YaTeX-cplread-with-learning yuuji@54: (if YaTeX-simple-messages yuuji@72: (format "maketitle-type (default %s): " YaTeX-single-command) yuuji@72: (format "%s??? (default %s)%s: " YaTeX-ec YaTeX-single-command yuuji@54: (if (> (minibuffer-depth) 0) yuuji@54: (format "[level:%d]" (minibuffer-depth)) ""))) yuuji@49: 'singlecmd-table 'user-singlecmd-table 'tmp-singlecmd-table yuuji@51: nil nil nil 'YaTeX-read-singlecmd-history))) yuuji@0: (if (string= single "") yuuji@72: (setq single YaTeX-single-command)) yuuji@72: (setq YaTeX-single-command single) yuuji@7: (setq YaTeX-current-completion-type 'maketitle) yuuji@54: (let ((dollar (and (not (YaTeX-in-math-mode-p)) yuuji@72: (YaTeX-math-member-p YaTeX-single-command))) yuuji@54: p q) yuuji@54: (if dollar (insert "$")) yuuji@72: (insert YaTeX-ec YaTeX-single-command) yuuji@52: (setq p (point)) yuuji@52: (insert (YaTeX-addin single) YaTeX-singlecmd-suffix) yuuji@54: (if dollar (insert "$")) yuuji@52: (setq q (point)) yuuji@52: (goto-char p) yuuji@52: (forward-char -2) yuuji@52: (if (looking-at "\\[\\]") (forward-char 1) (goto-char q))) yuuji@79: (YaTeX-package-auto-usepackage YaTeX-single-command 'maketitle) yuuji@5: (if YaTeX-current-position-register yuuji@69: (point-to-register YaTeX-current-position-register))) yuuji@0: yuuji@0: (defvar YaTeX-completion-begin-regexp "[{\\]" yuuji@51: "Regular expression of limit where LaTeX command's completion begins.") yuuji@0: yuuji@0: (defun YaTeX-do-completion () yuuji@0: "Try completion on LaTeX command preceding point." yuuji@0: (interactive) yuuji@0: (if yuuji@0: (or (eq (preceding-char) ? ) yuuji@0: (eq (preceding-char) ?\t) yuuji@0: (eq (preceding-char) ?\n) yuuji@0: (bobp)) yuuji@0: (message "Nothing to complete.") ;Do not complete yuuji@0: (let* ((end (point)) yuuji@6: (limit (point-beginning-of-line)) yuuji@0: (completion-begin yuuji@6: (progn (re-search-backward "[ \t\n]" limit 1) (point))) yuuji@0: (begin (progn yuuji@0: (goto-char end) yuuji@0: (if (re-search-backward YaTeX-completion-begin-regexp yuuji@0: completion-begin t) yuuji@0: (1+ (point)) yuuji@0: nil)))) yuuji@0: (goto-char end) yuuji@0: (cond yuuji@0: ((null begin) yuuji@13: (message "I think it is not a LaTeX sequence.")) yuuji@0: (t yuuji@49: (mapcar 'YaTeX-sync-local-table yuuji@18: '(tmp-section-table tmp-env-table tmp-singlecmd-table)) yuuji@165: (let*((pattern (YaTeX-buffer-substring begin end)) yuuji@6: (all-table yuuji@6: (append yuuji@6: section-table user-section-table tmp-section-table yuuji@6: env-table user-env-table tmp-env-table yuuji@6: singlecmd-table user-singlecmd-table tmp-singlecmd-table)) yuuji@6: ;; First, yuuji@6: ;; search completion without backslash. yuuji@6: (completion (try-completion pattern all-table))) yuuji@0: (if yuuji@0: (eq completion nil) yuuji@0: ;; Next, yuuji@0: ;; search completion with backslash yuuji@0: (setq completion yuuji@165: (try-completion yuuji@165: (YaTeX-buffer-substring (1- begin) end) yuuji@165: all-table nil) yuuji@0: begin (1- begin))) yuuji@0: (cond yuuji@0: ((null completion) yuuji@0: (message (concat "Can't find completion for '" pattern "'")) yuuji@0: (ding)) yuuji@0: ((eq completion t) (message "Sole completion.")) yuuji@0: ((not (string= completion pattern)) yuuji@82: (delete-region begin end) yuuji@0: (insert completion) yuuji@0: ) yuuji@0: (t yuuji@0: (message "Making completion list...") yuuji@0: (with-output-to-temp-buffer "*Help*" yuuji@0: (display-completion-list yuuji@69: (all-completions pattern all-table))))))))))) yuuji@0: yuuji@12: (defun YaTeX-toggle-modify-mode (&optional arg) yuuji@12: (interactive "P") yuuji@12: (or (memq 'YaTeX-modify-mode mode-line-format) yuuji@12: (setq mode-line-format yuuji@12: (append (list "" 'YaTeX-modify-mode) mode-line-format))) yuuji@11: (if (or arg (null YaTeX-modify-mode)) yuuji@11: (progn yuuji@12: (setq YaTeX-modify-mode "*m*") yuuji@11: (message "Modify mode")) yuuji@11: (setq YaTeX-modify-mode nil) yuuji@11: (message "Cancel modify mode.")) yuuji@69: (set-buffer-modified-p (buffer-modified-p))) ;redraw mode-line yuuji@11: yuuji@46: (defun YaTeX-switch-mode-menu (arg &optional char) yuuji@11: (interactive "P") yuuji@22: (message "Toggle: (M)odify-mode ma(T)h-mode") yuuji@46: (let ((c (or char (read-char)))) yuuji@11: (cond yuuji@11: ((= c ?m) (YaTeX-toggle-modify-mode arg)) yuuji@22: ((or (= c ?$) (= c ?t)) yuuji@22: (if YaTeX-auto-math-mode yuuji@22: (message "Makes no sense in YaTeX-auto-math-mode.") yuuji@69: (YaTeX-toggle-math-mode arg)))))) yuuji@11: yuuji@0: (defun YaTeX-insert-quote () yuuji@0: (interactive) yuuji@0: (insert yuuji@0: (cond yuuji@49: ((YaTeX-literal-p) ?\") yuuji@0: ((= (preceding-char) ?\\ ) ?\") yuuji@57: ;((= (preceding-char) ?\( ) ?\") yuuji@517: ((save-excursion (beginning-of-line) yuuji@517: (skip-chars-forward "\t ") yuuji@517: (looking-at "%#")) yuuji@517: ?\") yuuji@517: ((let ((ovl (overlays-at (point)))) yuuji@517: (and ovl yuuji@517: (catch 'found yuuji@517: (while ovl yuuji@517: (if (overlay-get (car ovl) 'filter-input) (throw 'found t)) yuuji@517: (setq ovl (cdr ovl)))))) yuuji@517: ?\") yuuji@22: ((or (= (preceding-char) 32) yuuji@22: (= (preceding-char) 9) yuuji@22: (= (preceding-char) ?\n) yuuji@22: (bobp) yuuji@22: (string-match yuuji@57: (regexp-quote (char-to-string (preceding-char))) yuuji@57: "、。,.?!「」『』【】()")) yuuji@22: "``") yuuji@69: (t "''")))) yuuji@22: yuuji@22: (defun YaTeX-closable-p () yuuji@22: (and (not YaTeX-modify-mode) yuuji@54: (not (eq YaTeX-close-paren-always 'never)) yuuji@22: (or YaTeX-close-paren-always (eolp)) yuuji@22: (not (input-pending-p)) yuuji@49: (not (YaTeX-literal-p))) yuuji@22: ;;(or YaTeX-modify-mode yuuji@22: ;; (and (not YaTeX-close-paren-always) (not (eolp))) yuuji@22: ;; (input-pending-p) yuuji@22: ;; (YaTeX-quick-in-environment-p "verbatim")) yuuji@69: ) yuuji@0: yuuji@5: (defun YaTeX-insert-braces-region (beg end &optional open close) yuuji@0: (interactive "r") yuuji@0: (save-excursion yuuji@0: (goto-char end) yuuji@184: (YaTeX-insert-inherit (or close "}")) yuuji@0: (goto-char beg) yuuji@184: (YaTeX-insert-inherit (or open "{")))) yuuji@0: yuuji@194: (defun YaTeX-get-macro-at-point (&optional p) yuuji@194: "Get (La)TeX macro around point P." yuuji@194: (interactive "d") yuuji@194: (save-excursion yuuji@194: (goto-char (setq p (or p (point)))) yuuji@198: (let ((token (substring (substring YaTeX-TeX-token-regexp 1) 0 -2)) yuuji@198: bsend) yuuji@198: (and (not (bobp)) yuuji@198: (or (looking-at YaTeX-TeX-token-regexp) yuuji@198: (string-match yuuji@198: YaTeX-TeX-token-regexp (char-to-string (preceding-char)))) yuuji@198: (progn yuuji@198: (skip-chars-backward token) yuuji@198: (equal (preceding-char) ?\\)) yuuji@198: (save-excursion yuuji@198: (setq bsend (point)) yuuji@198: (skip-chars-backward "\\\\") ;emacs18 doesn't return distance yuuji@198: (/= (% (- bsend (point)) 2) 0)) ;consider \\ yuuji@198: (looking-at YaTeX-TeX-token-regexp) yuuji@198: (YaTeX-match-string 0))))) yuuji@194: yuuji@49: (defun YaTeX-insert-braces (arg &optional open close) yuuji@49: (interactive "p") yuuji@194: (let ((begend-guide yuuji@194: (function yuuji@194: (lambda () yuuji@194: (if (equal (get 'YaTeX-insert-braces 'begend-guide) 2) yuuji@194: nil ;if triggered thrice, do nothing yuuji@194: (momentary-string-display yuuji@194: (format yuuji@194: (cond yuuji@196: (YaTeX-japan "begin/end入力には %s を使いましょう") yuuji@196: (t "You don't understand Zen of `%s'!")) yuuji@194: (key-description yuuji@194: (car (where-is-internal 'YaTeX-make-begin-end)))) yuuji@194: (point)) yuuji@194: (put 'YaTeX-insert-braces 'begend-guide yuuji@451: (+ 1 (YaTeX-str2int ;increment counter of beg-end guidance yuuji@194: (prin1-to-string yuuji@194: (get 'YaTeX-insert-braces 'begend-guide))))))))) yuuji@196: env macro not-literal b e) yuuji@22: (cond yuuji@392: ((YaTeX-region-active-p) yuuji@390: (YaTeX-insert-braces-region (region-beginning) (region-end))) yuuji@51: ((YaTeX-jmode) (YaTeX-self-insert arg)) yuuji@49: ((not (YaTeX-closable-p)) (YaTeX-self-insert arg)) yuuji@53: ((save-excursion yuuji@59: (and (> (- (point) (point-min)) 6) yuuji@59: (condition-case () (forward-char -6) (error nil))) yuuji@53: (looking-at "\\\\left\\\\")) yuuji@53: (insert "{\\right\\}") yuuji@53: (forward-char -8)) yuuji@193: ((save-excursion ;from matsumath.s.chiba-u.ac.jp yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\[bB]igl\\\\")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "{" (buffer-substring (match-beginning 0) (- (match-end 0) 2)) "r\\}")) yuuji@69: (forward-char -7)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 7) yuuji@69: (condition-case () (forward-char -7) (error nil))) yuuji@69: (looking-at "\\\\[bB]iggl\\\\")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "{" (buffer-substring (match-beginning 0) (- (match-end 0) 2)) "r\\}")) yuuji@69: (forward-char -8)) yuuji@69: ((= (preceding-char) ?\\ ) yuuji@69: (insert "{\\}") yuuji@69: (forward-char -2)) ;matsu's hack ends here yuuji@194: ((and (setq not-literal (not (YaTeX-literal-p))) yuuji@194: (equal "end" (setq macro (YaTeX-get-macro-at-point))) yuuji@22: (setq env (YaTeX-inner-environment))) yuuji@194: (funcall begend-guide) yuuji@196: (insert "{" env "}")) yuuji@194: ((and not-literal (equal "begin" macro)) yuuji@196: (insert "{") yuuji@196: (save-excursion yuuji@196: (indent-to (prog1 (- (current-column) 7) (insert "}\n"))) yuuji@196: (insert "\\end{}") yuuji@196: (setq e (point))) yuuji@194: (setq env yuuji@194: (YaTeX-read-environment yuuji@194: (format "Begin environment(default %s): " YaTeX-env-name))) yuuji@194: (if (string= "" env) (setq env YaTeX-env-name)) yuuji@194: (setq YaTeX-env-name env) yuuji@194: (funcall begend-guide) yuuji@196: (delete-region (- (point) 7) e) yuuji@194: (YaTeX-insert-begin-end env nil)) yuuji@22: (t yuuji@47: (insert (or open "{") (or close "}")) yuuji@60: (forward-char -1) yuuji@196: (if (and (eq (char-after (point)) ?\}) ;; the case `\\{}' yuuji@60: (eq (char-after (- (point) 2)) ?\\ )) yuuji@60: (progn (insert "\\") (forward-char -1))) yuuji@69: )))) yuuji@22: yuuji@22: (defun YaTeX-jmode () yuuji@22: (or (and (boundp 'canna:*japanese-mode*) canna:*japanese-mode*) yuuji@179: (and (boundp 'egg:*mode-on*) egg:*mode-on* egg:*input-mode*) yuuji@186: (and (boundp 'skk-mode) skk-mode (not skk-latin-mode)) yuuji@179: (and (boundp 'default-input-method) default-input-method yuuji@179: current-input-method))) yuuji@52: yuuji@59: (defun YaTeX-jmode-off () yuuji@179: (if (cond yuuji@179: ((and (boundp 'canna:*japanese-mode*) canna:*japanese-mode*) yuuji@179: (canna-toggle-japanese-mode) t) yuuji@179: ((and (boundp 'egg:*mode-on*) egg:*mode-on* egg:*input-mode*) yuuji@179: (egg:toggle-egg-mode-on-off) t) yuuji@179: ((and (fboundp 'skk-mode) (boundp 'skk-mode) skk-mode) yuuji@179: (cond yuuji@186: ((fboundp 'skk-latin-mode) yuuji@186: (or (and (boundp 'skk-henkan-mode) skk-henkan-mode) yuuji@186: (and (boundp 'skk-henkan-on) yuuji@186: (or skk-henkan-mode skk-henkan-active)) yuuji@186: (and (boundp 'j-henkan-on) yuuji@186: (or j-henkan-on j-henkan-active)) yuuji@186: ;; Deactivate jmode if henkan-mode is not running. yuuji@186: ;; Suggested by tt.tetsuo.tsukamoto. yuuji@186: (progn yuuji@186: (put 'YaTeX-jmode-on 'skkkata skk-katakana) yuuji@186: (skk-latin-mode t)))) yuuji@179: ((fboundp 'skk-mode-off) (skk-mode-off)) yuuji@179: (t (j-mode-off))) yuuji@179: t) yuuji@179: ((and (fboundp 'toggle-input-method) current-input-method) yuuji@179: (toggle-input-method) t) yuuji@179: ((and (fboundp 'fep-force-off) (fep-force-off)))) yuuji@179: (put 'YaTeX-jmode 'jmode t))) yuuji@179: yuuji@179: (defun YaTeX-jmode-on () yuuji@59: (cond yuuji@179: ((boundp 'canna:*japanese-mode*) yuuji@179: (if (not canna:*japanese-mode*) (canna-toggle-japanese-mode))) yuuji@179: ((boundp 'egg:*mode-on*) yuuji@179: (and (not egg:*mode-on*) (not egg:*input-mode*) yuuji@179: (egg:toggle-egg-mode-on-off))) yuuji@179: ((and (fboundp 'skk-mode) (boundp 'skk-mode)) yuuji@186: (if (get 'YaTeX-jmode-on 'skkkata) yuuji@186: (skk-j-mode-on t) yuuji@186: (skk-mode 1)) yuuji@186: (put 'YaTeX-jmode-on 'skkkata nil)) yuuji@179: ((fboundp 'toggle-input-method) yuuji@179: (if (not current-input-method) (toggle-input-method))) yuuji@179: ((and (fboundp 'fep-force-on) (fep-force-on))))) yuuji@179: yuuji@179: (defun YaTeX-jmode-back () yuuji@179: (if (get 'YaTeX-jmode 'jmode) yuuji@179: (YaTeX-jmode-on)) yuuji@179: (setplist 'YaTeX-jmode nil)) yuuji@59: yuuji@22: (defun YaTeX-self-insert (arg) yuuji@290: (call-interactively (global-key-binding (char-to-string (YaTeX-last-key))))) yuuji@184: (defun YaTeX-insert-inherit (&rest args) yuuji@184: (apply (if (fboundp 'insert-and-inherit) 'insert-and-inherit 'insert) yuuji@184: args)) yuuji@52: yuuji@22: (defun YaTeX-insert-brackets (arg) yuuji@22: "Insert Kagi-kakko or \\ [ \\] pair or simply \[." yuuji@22: (interactive "p") yuuji@22: (let ((col (1- (current-column)))) yuuji@22: (cond yuuji@392: ((YaTeX-region-active-p) yuuji@392: (YaTeX-insert-brackets-region (region-beginning) (region-end))) yuuji@22: ((YaTeX-jmode) (YaTeX-self-insert arg)) yuuji@22: ((not (YaTeX-closable-p)) yuuji@22: (YaTeX-self-insert arg)) yuuji@53: ((save-excursion yuuji@53: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@53: (looking-at "\\\\left")) yuuji@184: (YaTeX-insert-inherit "[\\right]") yuuji@53: (forward-char -7)) yuuji@193: ((save-excursion ;from matsumath.s.chiba-u.ac.jp yuuji@69: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@69: (looking-at "\\\\[bB]igl")) yuuji@184: (YaTeX-insert-inherit yuuji@69: (concat yuuji@69: "[" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r]")) yuuji@69: (forward-char -6)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\[bB]iggl")) yuuji@184: (YaTeX-insert-inherit yuuji@69: (concat yuuji@69: "[" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r]")) yuuji@69: (forward-char -7)) ;matsu's hack ends here yuuji@36: ((and (= (preceding-char) ?\\ ) yuuji@36: (/= (char-after (- (point) 2)) ?\\ ) yuuji@36: (not (YaTeX-in-math-mode-p))) yuuji@290: (YaTeX-insert-inherit (YaTeX-last-key) "\n") yuuji@22: (indent-to (max 0 col)) yuuji@184: (YaTeX-insert-inherit "\\]") yuuji@22: (beginning-of-line) yuuji@22: (open-line 1) yuuji@53: (delete-region (point) (progn (beginning-of-line) (point))) yuuji@22: (indent-to (+ YaTeX-environment-indent (max 0 col))) yuuji@53: (or YaTeX-auto-math-mode YaTeX-math-mode (YaTeX-toggle-math-mode 1))) yuuji@22: ((YaTeX-closable-p) yuuji@184: (YaTeX-insert-inherit "[]") yuuji@22: (backward-char 1)) yuuji@69: (t (YaTeX-self-insert arg))))) yuuji@0: yuuji@5: (defun YaTeX-insert-brackets-region (beg end) yuuji@5: (interactive "r") yuuji@69: (YaTeX-insert-braces-region beg end "[" "]")) yuuji@5: yuuji@22: (defun YaTeX-insert-parens (arg) yuuji@22: "Insert parenthesis pair." yuuji@22: (interactive "p") yuuji@22: (cond yuuji@392: ((YaTeX-region-active-p) yuuji@392: (YaTeX-insert-parens-region (region-beginning) (region-end))) yuuji@22: ((YaTeX-jmode) (YaTeX-self-insert arg)) yuuji@22: ((not (YaTeX-closable-p)) (YaTeX-self-insert arg)) yuuji@53: ((save-excursion yuuji@53: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@53: (looking-at "\\\\left")) yuuji@184: (YaTeX-insert-inherit "(\\right)") yuuji@53: (forward-char -7)) yuuji@193: ((save-excursion ;from matsumath.s.chiba-u.ac.jp yuuji@69: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@69: (looking-at "\\\\[bB]igl")) yuuji@184: (YaTeX-insert-inherit yuuji@69: (concat yuuji@69: "(" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r)")) yuuji@69: (forward-char -6)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\[bB]iggl")) yuuji@184: (YaTeX-insert-inherit yuuji@69: (concat yuuji@69: "(" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r)")) yuuji@69: (forward-char -7)) yuuji@69: ((= (preceding-char) ?\\ ) ;matsu's hack ends here yuuji@184: (YaTeX-insert-inherit "(\\)") yuuji@22: (backward-char 2)) yuuji@22: ((YaTeX-closable-p) yuuji@184: (YaTeX-insert-inherit "()") yuuji@22: (backward-char 1)) yuuji@69: (t (YaTeX-self-insert arg)))) yuuji@22: yuuji@11: (defun YaTeX-insert-parens-region (beg end) yuuji@11: (interactive "r") yuuji@69: (YaTeX-insert-braces-region beg end "(" ")")) yuuji@69: yuuji@69: (defun YaTeX-insert-bar (arg) yuuji@69: "Insert bar pair." yuuji@69: (interactive "p") yuuji@69: (cond yuuji@69: ((YaTeX-jmode) (YaTeX-self-insert arg)) yuuji@69: ((not (YaTeX-closable-p)) (YaTeX-self-insert arg)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@69: (looking-at "\\\\left")) yuuji@184: (YaTeX-insert-inherit "|\\right|") yuuji@69: (forward-char -7)) yuuji@193: ((save-excursion ;from matsumath.s.chiba-u.ac.jp yuuji@69: (and (> (- (point) (point-min)) 5) (forward-char -5)) yuuji@69: (looking-at "\\\\[bB]igl")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "|" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r|")) yuuji@69: (forward-char -6)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\[bB]iggl")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "|" (buffer-substring (match-beginning 0) (- (match-end 0) 1)) "r|")) yuuji@69: (forward-char -7)) yuuji@193: ((save-excursion ; added by Jin nifty.ne.jp> yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\left\\\\")) yuuji@184: (YaTeX-insert-inherit "|\\right\\|") yuuji@69: (forward-char -8)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 6) (forward-char -6)) yuuji@69: (looking-at "\\\\[bB]igl\\\\")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "|" (buffer-substring (match-beginning 0) (- (match-end 0) 2)) "r\\|")) yuuji@69: (forward-char -7)) yuuji@69: ((save-excursion yuuji@69: (and (> (- (point) (point-min)) 7) (forward-char -7)) yuuji@69: (looking-at "\\\\[bB]iggl\\\\")) yuuji@69: (insert yuuji@69: (concat yuuji@69: "|" (buffer-substring (match-beginning 0) (- (match-end 0) 2)) "r\\|")) yuuji@69: (forward-char -8)) ; added by Jin up to here. yuuji@69: ((= (preceding-char) ?\\ ) yuuji@184: (YaTeX-insert-inherit "|\\|") yuuji@69: (backward-char 2)) yuuji@69: ; ((and (YaTeX-closable-p) yuuji@69: ; (/= (preceding-char) ?|) yuuji@69: ; (/= (following-char) ?|)) yuuji@184: ; (YaTeX-insert-inherit "||") yuuji@69: ; (backward-char 1)) yuuji@69: (t (YaTeX-self-insert arg)))) yuuji@11: yuuji@285: (defvar YaTeX-use-jmode-hook yuuji@285: (and (featurep 'canna) (boundp 'canna:*initialized*) canna:*initialized*) yuuji@285: ;; (not (and (fboundp 'skk-mode) (boundp 'skk-mode))) yuuji@197: "*Non-nil means activate automatic jmode switcher within/out math mode. yuuji@197: Hopefully, change default to t in the next version of 1.75.") yuuji@179: (defun YaTeX-jmode-hook (old new) yuuji@179: "A hook controling jmode on/off." yuuji@186: ;; This function is called via point-entered/leave hook, so that yuuji@186: ;; codes in it is evaluated on such emacsen as having text-properties. yuuji@179: (let ((inhibit-point-motion-hooks t) yuuji@179: (oldp (plist-get (text-properties-at old) 'point-left)) yuuji@179: (newp (plist-get (text-properties-at new) 'point-left)) yuuji@179: (lnew (plist-get (text-properties-at new) 'last-new)) yuuji@186: (mjmode (plist-get (text-properties-at new) 'mjmode)) yuuji@186: (bmp (buffer-modified-p)) yuuji@179: (jm (YaTeX-jmode)) b e) yuuji@181: (unwind-protect yuuji@181: (cond yuuji@181: ((eq lnew new) nil) ;Do nothing if continuous entry yuuji@181: ((and (not (eq newp 'YaTeX-jmode-hook)) yuuji@186: (eq oldp 'YaTeX-jmode-hook) yuuji@186: (plist-get (text-properties-at old) 'entered)) yuuji@181: ;; leave yuuji@181: (remove-text-properties yuuji@186: (setq b (1+ (or (previous-single-property-change old 'point-left) yuuji@186: (1- (point))))) yuuji@186: (setq e (1- (or (next-single-property-change old 'point-left) yuuji@186: (1+ (point))))) yuuji@186: (list 'last-new nil 'entered nil)) yuuji@186: (add-text-properties b e (list 'mjmode jm)) yuuji@186: (if (boundp 'skk-katakana) yuuji@186: (put 'YaTeX-jmode-on 'skkkata skk-katakana)) yuuji@181: (if (plist-get (text-properties-at old) 'jmode) yuuji@181: (YaTeX-jmode-on))) yuuji@181: ((and (not (eq oldp 'YaTeX-jmode-hook)) yuuji@186: (eq newp 'YaTeX-jmode-hook) yuuji@186: (not (plist-get (text-properties-at new) 'entered))) yuuji@181: ;; enter yuuji@181: (add-text-properties yuuji@181: (1+ (or (previous-single-property-change new 'point-left) yuuji@181: (1- (point)))) yuuji@181: (1- (or (next-single-property-change new 'point-left) yuuji@181: (1+ (point)))) yuuji@186: (list 'jmode jm 'last-new new 'entered t)) yuuji@186: (if (boundp 'skk-katakana) ;care for skk katakana mode yuuji@186: (put 'YaTeX-jmode-on 'skkkata skk-katakana)) yuuji@186: (if mjmode (YaTeX-jmode-on) (YaTeX-jmode-off)))) yuuji@181: ;;unwind job yuuji@181: (set-buffer-modified-p bmp)))) yuuji@179: yuuji@0: (defun YaTeX-insert-dollar () yuuji@0: (interactive) yuuji@22: (if (or (not (YaTeX-closable-p)) yuuji@57: (= (preceding-char) 92) yuuji@58: (and (YaTeX-in-math-mode-p) yuuji@58: (or (/= (preceding-char) ?$) (/= (following-char) ?$)))) yuuji@7: (insert "$") yuuji@7: (insert "$$") yuuji@22: (forward-char -1) yuuji@197: (and YaTeX-use-jmode-hook yuuji@197: (fboundp 'add-text-properties) yuuji@197: (add-text-properties yuuji@197: (1- (point)) (1+ (point)) yuuji@197: (list 'point-left 'YaTeX-jmode-hook yuuji@197: 'point-entered 'YaTeX-jmode-hook yuuji@197: 'front-sticky t yuuji@197: 'rear-nonsticky t yuuji@197: 'mjmode nil yuuji@197: 'jmode (YaTeX-jmode)))) yuuji@59: (YaTeX-jmode-off) yuuji@69: (or YaTeX-auto-math-mode YaTeX-math-mode (YaTeX-toggle-math-mode 1)))) yuuji@0: yuuji@11: (defun YaTeX-insert-dollars-region (beg end) yuuji@11: (interactive "r") yuuji@69: (YaTeX-insert-braces-region beg end "$" "$")) yuuji@11: yuuji@57: (defun YaTeX-insert-amper () yuuji@57: (interactive) yuuji@57: (if (or (string-match YaTeX-array-env-regexp yuuji@57: (or (YaTeX-inner-environment t) "document")) yuuji@57: (= (preceding-char) 92) yuuji@77: (YaTeX-literal-p) yuuji@77: (YaTeX-in-math-mode-p)) yuuji@57: (insert "&") yuuji@69: (insert "\\&"))) yuuji@57: yuuji@0: (defun YaTeX-version () yuuji@0: "Return string of the version of running YaTeX." yuuji@0: (interactive) yuuji@0: (message yuuji@5: (concat "Yet Another tex-mode " yuuji@55: (if YaTeX-japan "「野鳥」" "`Wild Bird'") yuuji@7: " Revision " yuuji@69: YaTeX-revision-number))) yuuji@0: yuuji@46: (defun YaTeX-typeset-menu (arg &optional char) yuuji@46: "Typeset, preview, visit error and miscellaneous convenient menu. yuuji@46: Optional second argument CHAR is for non-interactive call from menu." yuuji@5: (interactive "P") yuuji@7: (message yuuji@130: (concat "J)latex R)egion E)nv B)ibtex mk(I)dx " yuuji@123: "latex+p(D)f " yuuji@123: (if (fboundp 'start-process) "K)ill ") yuuji@58: "P)review " yuuji@58: (and (boundp 'window-system) window-system "S)earch ") yuuji@123: "V)iewErr L)pr")) yuuji@46: (let ((sw (selected-window)) (c (or char (read-char)))) yuuji@32: (require 'yatexprc) ;for Nemacs's bug yuuji@32: (select-window sw) yuuji@4: (cond yuuji@327: ((memq c '(?j ?\C-j)) (YaTeX-typeset-buffer) ; memq for usability test yuuji@327: (put 'dvi2-command 'format 'dvi)) yuuji@5: ((= c ?r) (YaTeX-typeset-region)) yuuji@130: ((= c ?e) (YaTeX-typeset-environment)) yuuji@224: ((= c ?b) (YaTeX-call-builtin-on-file yuuji@227: "BIBTEX" bibtex-command arg)) yuuji@224: ((= c ?i) (YaTeX-call-builtin-on-file yuuji@227: "MAKEINDEX" makeindex-command arg)) yuuji@7: ((= c ?k) (YaTeX-kill-typeset-process YaTeX-typeset-process)) yuuji@4: ((= c ?p) (call-interactively 'YaTeX-preview)) yuuji@351: ((= c ?q) (YaTeX-system "lpq" "Printer queue")) yuuji@288: ((= c ?d) (YaTeX-typeset-buffer yuuji@327: (or (YaTeX-get-builtin "DVIPDF") YaTeX-dvipdf-command)) yuuji@327: (put 'dvi2-command 'format 'pdf)) yuuji@4: ((= c ?v) (YaTeX-view-error)) yuuji@5: ((= c ?l) (YaTeX-lpr arg)) yuuji@13: ((= c ?m) (YaTeX-switch-mode-menu arg)) yuuji@69: ((= c ?s) (YaTeX-xdvi-remote-search arg))))) yuuji@4: yuuji@72: (if (fboundp 'wrap-function-to-control-ime) yuuji@72: (wrap-function-to-control-ime 'YaTeX-typeset-menu t "P")) yuuji@72: yuuji@72: yuuji@46: (defun YaTeX-%-menu (&optional beg end char) yuuji@13: "Operate %# notation." yuuji@16: ;;Do not use interactive"r" for the functions which require no mark yuuji@16: (interactive) yuuji@410: (message "!)Edit-%%#! D)VIPDF B)EGIN-END P)review pdf(V)iew L)PR M)akeidx b)ibtex dp(I)") yuuji@46: (let ((c (or char (read-char))) (string "") key yuuji@13: (b (make-marker)) (e (make-marker))) yuuji@13: (save-excursion yuuji@13: (cond yuuji@410: ((rindex "!plmibdv" c) ;Edit %#xxx yuuji@227: (setq key (cdr (assq c '((?! . "!") yuuji@227: (?p . "PREVIEW") yuuji@227: (?l . "LPR") yuuji@407: (?m . "MAKEINDEX") yuuji@386: (?d . "DVIPDF") yuuji@410: (?v . "PDFVIEW") yuuji@407: (?i . "IMAGEDPI") yuuji@227: (?b . "BIBTEX"))))) yuuji@227: (YaTeX-getset-builtin key t)) yuuji@13: yuuji@385: ((= c ?B) ;%#BEGIN %#END region yuuji@16: (or end (setq beg (min (point) (mark)) end (max (point) (mark)))) yuuji@13: (set-marker b beg) yuuji@13: (set-marker e end) yuuji@13: (goto-char (point-min)) yuuji@13: (while (re-search-forward "^%#\\(BEGIN\\)\\|\\(END\\)$" nil t) yuuji@53: (beginning-of-line) yuuji@53: (delete-region (point) (progn (forward-line 1) (point)))) yuuji@68: (goto-char b) yuuji@13: (open-line 1) yuuji@53: (delete-region (point) (progn (beginning-of-line)(point)));for 19 :-< yuuji@13: (insert "%#BEGIN") yuuji@68: (goto-char e) yuuji@68: (insert "%#END\n") yuuji@68: (set-marker b nil) yuuji@386: (set-marker e nil)))))) yuuji@13: yuuji@168: (defvar YaTeX-refcommand-def-regexp-default yuuji@168: "label\\|bibitem") yuuji@168: (defvar YaTeX-refcommand-def-regexp-private nil yuuji@168: "*Regexp of defining label commands") yuuji@168: (defvar YaTeX-refcommand-def-regexp yuuji@168: (concat (if YaTeX-refcommand-def-regexp-private yuuji@168: (concat YaTeX-refcommand-def-regexp-private "\\|")) yuuji@168: YaTeX-refcommand-def-regexp-default)) yuuji@168: yuuji@168: (defvar YaTeX-refcommand-ref-regexp-default yuuji@314: "\\(page\\|eq\\|fig\\)?ref\\|cite" yuuji@314: "Regexp of LaTeX's label-referring macros. yuuji@314: Searching for this will be done without `\\\\'. yuuji@314: So you need not add patterns if new referring macro ends with \"ref\".") yuuji@168: (defvar YaTeX-refcommand-ref-regexp-private nil yuuji@314: "*Regexp of referring label commands. yuuji@314: See documentation of `YaTeX-refcommand-ref-regexp-default'.") yuuji@168: (defvar YaTeX-refcommand-ref-regexp yuuji@168: (concat (if YaTeX-refcommand-ref-regexp-private yuuji@168: (concat YaTeX-refcommand-ref-regexp-private "\\|")) yuuji@168: YaTeX-refcommand-ref-regexp-default)) yuuji@168: yuuji@168: (defvar YaTeX-refcommand-regexp yuuji@168: (concat YaTeX-refcommand-def-regexp yuuji@168: "\\|" YaTeX-refcommand-ref-regexp) yuuji@168: "Regexp of label defining/referring command name.") yuuji@168: yuuji@51: (defun YaTeX-goto-corresponding-label (reverse &optional otherwin) yuuji@48: "Jump to corresponding \\label{} and \\ref{} or \\cite and \\bibitem. yuuji@48: The default search direction depends on the command at the cursor position. yuuji@48: When the cursor is on \\ref(\\cite), YaTeX will try to search the yuuji@48: corresponding \\label(\\bibitem) backward, yuuji@48: and if it fails search forward again. And when the cursor is yuuji@48: on \\label(\\bibitem), YaTeX will search the corresponding \\ref(\\cite) yuuji@48: forward at first and secondary backward. yuuji@48: Argument REVERSE non-nil makes the default yuuji@48: direction rule reverse. Since Search string is automatically set in yuuji@13: search-last-string, you can repeat search the same label/ref by typing yuuji@51: \\[isearch-forward] or \\[isearch-backward]. yuuji@51: If optional second argument OTHERWIN is non-nil, move to other window." yuuji@13: yuuji@51: (let ((scmd "") label direc string blist (p (point)) (cb (current-buffer)) yuuji@168: (refcommands YaTeX-refcommand-regexp) yuuji@82: (foundmsg (format "Type %s %c to return to original position." yuuji@82: (key-description yuuji@82: (car yuuji@82: (or (where-is-internal 'register-to-point) yuuji@82: (where-is-internal 'jump-to-register)))) yuuji@82: YaTeX-current-position-register)) yuuji@48: (func (function (lambda (string sfunc) yuuji@48: (or yuuji@48: (funcall sfunc string nil t) yuuji@68: (funcall (if (eq sfunc 're-search-forward) yuuji@68: 're-search-backward 're-search-forward) yuuji@48: string nil t)))))) yuuji@7: (cond yuuji@48: ((YaTeX-on-section-command-p refcommands) yuuji@82: (setq scmd yuuji@82: (cdr yuuji@82: (assoc yuuji@82: (YaTeX-match-string 1) yuuji@82: '(("label" . "\\\\\\(page\\|eq\\)?ref{%k}") yuuji@82: ("ref" . "\\\\label{%k}") yuuji@82: ("eqref" . "\\\\label{%k}") yuuji@82: ("pageref" . "\\\\label{%k}") yuuji@82: ("cite" . yuuji@82: "\\\\bibitem\\(\\[[^]]+\\]\\)?{%k}\\|^\\s *@[a-z]+{%k,") yuuji@82: ("bibitem" . "\\\\cite\\(\\[[^]]+\\]\\)?"))))) yuuji@7: (goto-char (match-end 0)) yuuji@165: (let ((label (YaTeX-buffer-substring yuuji@82: (1- (point)) (progn (backward-list 1) (1+ (point))))) yuuji@82: (fp (make-marker))fl fn yuuji@82: (goother (function (lambda (buffer point) yuuji@82: (goto-char point) yuuji@82: (if (one-window-p) yuuji@82: (split-window-calculate-height yuuji@82: YaTeX-default-pop-window-height)) yuuji@82: (select-window (get-lru-window)) yuuji@82: (switch-to-buffer buffer))))) yuuji@68: ;(setq string (concat "\\" scmd "{" label "}")) yuuji@82: ;(setq string (concat "\\\\" scmd "{" (regexp-quote label) "}")) yuuji@82: (setq string (YaTeX-replace-format scmd "k" (regexp-quote label))) yuuji@48: (setq direc (if (string-match "ref\\|cite" scmd) yuuji@68: 're-search-forward 're-search-backward)) yuuji@48: (if YaTeX-current-position-register yuuji@48: (point-to-register YaTeX-current-position-register)) yuuji@68: (if reverse (setq direc (if (eq direc 're-search-forward) yuuji@68: 're-search-backward 're-search-forward))) yuuji@48: (if (funcall func string direc) ;label/ref found! yuuji@13: (progn yuuji@82: (if otherwin (funcall goother cb p)) yuuji@13: (goto-char (match-beginning 0)) yuuji@51: (push-mark p)) yuuji@51: ;;if label/ref not found, search through all yatex buffers. yuuji@51: (goto-char p) ;resume position of current buffer yuuji@48: (catch 'found yuuji@82: (setq blist (YaTeX-yatex-buffer-list)) yuuji@48: (while blist yuuji@82: ;; search for corresponding keyword yuuji@48: (set-buffer (car blist)) yuuji@48: (if (YaTeX-on-section-command-p refcommands) yuuji@48: (goto-char (match-beginning 0))) yuuji@82: (cond yuuji@82: ; cond1 yuuji@82: ((funcall func string direc) yuuji@82: (cond yuuji@82: (otherwin yuuji@82: (set-buffer cb) yuuji@82: (funcall goother (car blist) p)) yuuji@82: ((or (get-buffer-window (car blist)) yuuji@82: (and YaTeX-emacs-19 yuuji@82: (get-buffer-window (car blist) t))) yuuji@82: (goto-buffer-window (car blist))) yuuji@82: (t yuuji@82: (switch-to-buffer (car blist)) yuuji@82: (message foundmsg))) yuuji@82: (goto-char (match-beginning 0)) yuuji@82: (throw 'found t)) yuuji@82: ; cond2 yuuji@82: ((and yuuji@82: (string-match "bibitem" scmd) yuuji@82: (catch 'found2 yuuji@82: (save-excursion yuuji@82: (goto-char (point-min)) yuuji@82: (while (YaTeX-re-search-active-forward yuuji@82: "\\\\bibliography{\\([^}]*\\)}" "%" nil t) yuuji@82: (setq fl (YaTeX-split-string (YaTeX-match-string 1) ",")) yuuji@82: (while fl yuuji@82: (if (or (file-exists-p (setq fn (car fl))) yuuji@82: (file-exists-p (setq fn (concat fn ".bib")))) yuuji@82: (progn yuuji@82: (set-buffer (find-file-noselect fn)) yuuji@82: (save-excursion yuuji@82: (goto-char (point-min)) yuuji@82: (if (YaTeX-re-search-active-forward yuuji@82: string "%" nil t) yuuji@82: (throw 'found2 yuuji@82: (set-marker fp (point))))))) yuuji@82: (setq fl (cdr fl))))))) yuuji@82: (if otherwin yuuji@82: (funcall goother (marker-buffer fp) fp) yuuji@82: (switch-to-buffer (marker-buffer fp)) yuuji@82: (goto-char fp)) yuuji@82: (set-marker fp nil) yuuji@82: (message foundmsg) yuuji@82: (throw 'found t))) yuuji@82: (setq blist (cdr blist))) yuuji@82: ;; search for bibliography yuuji@82: ))) yuuji@48: (if YaTeX-emacs-19 yuuji@68: (setq regexp-search-ring yuuji@68: (cons string (delete string regexp-search-ring))) yuuji@68: (setq search-last-regexp string))) yuuji@69: (t nil)))) yuuji@5: yuuji@73: ;;YaTeX-goto-corresponding-environment was moved to yatexlib yuuji@3: yuuji@60: (defun YaTeX-goto-corresponding-file (&optional other) yuuji@60: "Visit or switch buffer of corresponding file, yuuji@176: looking at \\input or \\include or \\includeonly on current line." yuuji@60: (if (not (YaTeX-on-includes-p)) nil yuuji@70: (let ((parent buffer-file-name) input-file b) yuuji@60: (save-excursion yuuji@86: (if (and (re-search-forward "[{%]" (point-end-of-line) t) yuuji@86: (= ?{ (char-after (match-beginning 0)))) yuuji@60: nil yuuji@60: (skip-chars-backward "^,{")) yuuji@60: (setq input-file yuuji@165: (YaTeX-buffer-substring yuuji@60: (point) (progn (skip-chars-forward "^ ,}") (point)))) yuuji@60: (if (not (string-match "\\.\\(tex\\|sty\\)$" input-file)) yuuji@60: (setq input-file (concat input-file ".tex")))) yuuji@60: (cond yuuji@60: (other (YaTeX-switch-to-buffer-other-window input-file)) yuuji@70: ((setq b (YaTeX-get-file-buffer input-file)) yuuji@70: (goto-buffer-window b)) yuuji@60: (t (YaTeX-switch-to-buffer input-file))) yuuji@60: (or (YaTeX-get-builtin "!") yuuji@60: YaTeX-parent-file yuuji@69: (setq YaTeX-parent-file parent))))) yuuji@5: yuuji@5: (defun YaTeX-goto-corresponding-BEGIN-END () yuuji@5: (if (not (YaTeX-on-BEGIN-END-p)) nil yuuji@5: (if (cond yuuji@5: ((equal (match-beginning 0) (match-beginning 1)) ;if on %#BEGIN yuuji@5: (not (search-forward "%#END" nil t))) yuuji@5: (t ; if on %#END yuuji@5: (not (search-backward "%#BEGIN" nil t)))) yuuji@7: (error "Corresponding %%#BEGIN/END not found.")) yuuji@5: (beginning-of-line) yuuji@69: t)) yuuji@5: yuuji@59: (defvar YaTeX-processed-file-regexp-alist nil yuuji@59: "Alist of regexp of processed file regexp vs. its file name part; yuuji@59: For example, if you include image file with `\\epsfile{file=FILE}' where yuuji@59: `FILE' is processed file. You might want to view FILE with other previewer yuuji@59: such as ghostview, or want to preview its source which was drawn with yuuji@59: other drawing tool, tgif for example. Then you should set entire regexp yuuji@59: of including expression and enclose its file name part with \\\\( and \\\\). yuuji@59: yuuji@59: Ex. (\"\\\\\\\\epsfile{[^}]*file=\\\\([^,} ]+\\\\)\\\\(\\\\.e?ps\\\\)?[^}]*}\" 1) yuuji@59: yuuji@59: Where the first group surrounded by \\\\( and \\\\) is the file name part yuuji@59: of expression. So you should set 1 to second element. And the first yuuji@59: matching group is sent to (image) processor defined by the variable yuuji@59: YaTeX-file-processor-alist. See also the documentation of yuuji@59: YaTeX-file-processor-alist. yuuji@59: yuuji@59: ↑じゃ良くわかんないすね。例えば tgif hoge.obj して hoge.eps を yuuji@59: \\epsfile{file=hoge.eps} でインクルードしているとしよう。その行で yuuji@59: \[prefix\] g を押した時に tgif を起動して欲しかったら、まず上のような yuuji@59: 正規表現を設定する。\\\\(と\\\\)で囲んだところがファイル名になるように yuuji@59: 注意する。でファイル名部分が何番目の\\\\(\\\\)になるかをリストの2番目に書く。 yuuji@59: すると、その部分が変数 YaTeX-file-processor-alist で定義された yuuji@59: 処理プログラムに渡される。というわけ。 yuuji@59: ん〜やっぱりむずかしいね。分からない時は隣の Lisper に聞くか、 yuuji@59: fj野鳥の会で聞こう! yuuji@59: ") yuuji@59: yuuji@59: (defvar YaTeX-processed-file-regexp-alist-default yuuji@64: '(("\\\\epsfile\\(\\[[^]]+\\]\\)?{[^},]*file=\\(\\([^,} ]*/\\)?[^,}. ]+\\)\\(\\.e?ps\\)?[^}]*}" 2) yuuji@60: ("\\\\epsfig{[^},]*fi\\(le\\|gure\\)=\\(\\([^,} ]*/\\)?[^,}. ]+\\)\\(\\.e?ps\\)?[^}]*}" 2) yuuji@60: ("\\\\postscriptbox{[^}]*}{[^}]*}{\\(\\([^,} ]*/\\)?[^}. ]+\\)\\(\\.e?ps\\)?}" 1) yuuji@274: ("\\\\\\(epsfbox\\|epsfig\\)\\*?{\\(\\([^,} ]*/\\)?[^}. ]+\\)\\(\\.e?ps\\)?}" 2) ;\epsfbox{hoge.ps} yuuji@275: ("\\\\includegraphics\\*?\\(.*\\]\\|\\s \\)?{\\(.*\\)\\(\\.ai\\|\\.pdf\\|\\.svg\\|\\.png\\|\\.jpe?g\\|\\.e?ps\\)}" 2) ;\includegraphics[options...]{hoge.eps} yuuji@60: ("\\\\\\(psbox\\)\\(\\[[^]]+\\]\\)?{\\(\\([^,} ]*/\\)?[^} ]+\\)\\(\\.e?ps\\)}" 3) ;\psbox[options...]{hoge.eps} (97/1/11) yuuji@68: ("\\\\input{\\([^} ]+\\)\\(\\.tps\\)}" 1) ;tgif2tex (1998/9/16) yuuji@59: ) yuuji@69: "See the documentation of YaTeX-processed-file-regexp-alist.") yuuji@59: yuuji@59: (defvar YaTeX-file-processor-alist nil yuuji@59: "*Alist of files' processor vs. its extension; yuuji@69: See also the documentation of YaTeX-processed-file-regexp-alist.") yuuji@274: yuuji@509: ;; Will go to yatexflt.el yuuji@509: (defun YaTeX-filter-goto-source (file other-win) yuuji@509: "Go to corresponding text source of the graphic file" yuuji@509: (cond yuuji@509: ((file-exists-p file) yuuji@509: (let ((buf (find-file-noselect file))) yuuji@509: (funcall (cond (other-win 'YaTeX-switch-to-buffer-other-window) yuuji@509: ((get-buffer-window buf) 'goto-buffer-window) yuuji@509: (t 'YaTeX-switch-to-buffer)) yuuji@509: buf) yuuji@509: yuuji@509: )))) yuuji@509: yuuji@59: (defvar YaTeX-file-processor-alist-default yuuji@334: (list (cons YaTeX-cmd-tgif ".obj") yuuji@334: (cons YaTeX-cmd-gimp ".xcf") yuuji@334: (cons YaTeX-cmd-gimp ".xcf.gz") yuuji@334: (cons YaTeX-cmd-gimp ".xcf.bz2") yuuji@334: (cons YaTeX-cmd-edit-svg ".svg") yuuji@334: (cons YaTeX-cmd-edit-svg ".svgz") yuuji@334: (cons YaTeX-cmd-edit-ai ".ai") yuuji@334: '("dia" . ".dia") yuuji@334: (cons YaTeX-cmd-ooo ".odg") yuuji@509: (cons 'YaTeX-filter-goto-source ".diag") yuuji@509: (cons 'YaTeX-filter-goto-source ".dot") yuuji@509: ;; List of target file itself below... yuuji@334: (cons YaTeX-cmd-edit-images ".jpeg") yuuji@334: (cons YaTeX-cmd-edit-images ".jpg") yuuji@334: (cons YaTeX-cmd-edit-images ".png") yuuji@334: (cons YaTeX-cmd-edit-ps ".ps") yuuji@334: (cons YaTeX-cmd-edit-ps ".eps") yuuji@334: (cons YaTeX-cmd-edit-pdf ".pdf") yuuji@334: '(t . ".tex") yuuji@334: '(t . ".sty") yuuji@334: '(t . "")) yuuji@69: "See the documentation of YaTeX-file-processor-alist.") yuuji@59: yuuji@59: (defun YaTeX-goto-corresponding-file-processor (&optional other) yuuji@59: "Execute corresponding file processor." yuuji@59: (save-excursion yuuji@59: (or (looking-at YaTeX-ec-regexp) yuuji@59: (skip-chars-backward (concat "^" YaTeX-ec) (point-beginning-of-line))) yuuji@59: (let ((list (append YaTeX-processed-file-regexp-alist yuuji@59: YaTeX-processed-file-regexp-alist-default)) yuuji@59: (p (point)) flist file yuuji@70: (peol (point-end-of-line)) yuuji@70: (basedir yuuji@70: (if YaTeX-search-file-from-top-directory yuuji@70: (save-excursion (YaTeX-visit-main t) default-directory) yuuji@70: "."))) yuuji@59: (setq flist (catch 'found yuuji@70: (while list yuuji@70: (goto-char p) yuuji@70: (if (re-search-forward (car (car list)) peol t) yuuji@70: (progn yuuji@70: (setq file (YaTeX-match-string yuuji@70: (car (cdr (car list))))) yuuji@70: (throw 'found (cdr (car list))))) yuuji@70: (setq list (cdr list))))) yuuji@59: (if flist ;if pattern and file name found yuuji@59: (let*((plist (append YaTeX-file-processor-alist yuuji@59: YaTeX-file-processor-alist-default)) yuuji@59: (plist0 plist) yuuji@59: ext cmd src buf (alt (car (cdr flist)))) yuuji@59: (if (and (re-search-forward yuuji@59: (concat YaTeX-comment-prefix "\\s *\\(.*\\)$") peol t) yuuji@59: (assoc (setq cmd (YaTeX-match-string 1)) yuuji@59: YaTeX-file-processor-alist)) yuuji@59: (setq src ;if processor is specified yuuji@59: (concat file yuuji@59: (cdr (assoc cmd YaTeX-file-processor-alist)))) yuuji@59: (while plist ;if processor is not specified yuuji@59: (setq ext (cdr (car plist))) yuuji@60: (if (and (string< "" (concat file ext)) yuuji@70: (file-exists-p yuuji@70: (expand-file-name (concat file ext) basedir))) yuuji@70: (setq cmd (car (car plist)) yuuji@70: src (concat file ext) plist nil)) yuuji@59: (setq plist (cdr plist))) yuuji@59: (if (and (null src) alt YaTeX-create-file-prefix-g) yuuji@59: (setq cmd alt yuuji@59: src (concat file (cdr (assoc alt plist0)))))) yuuji@70: (if src ;if processor and src file found yuuji@70: (let ((default-directory basedir)) yuuji@59: (cond yuuji@70: ((stringp cmd) yuuji@351: (YaTeX-system (concat cmd " " src) cmd) yuuji@351: t) yuuji@70: ((eq t cmd) yuuji@70: (let ((parent buffer-file-name)) yuuji@70: (funcall yuuji@70: (cond yuuji@70: (other 'YaTeX-switch-to-buffer-other-window) yuuji@70: ((get-file-buffer src) 'goto-buffer-window) yuuji@70: (t 'YaTeX-switch-to-buffer)) yuuji@70: src) yuuji@70: (or (YaTeX-get-builtin "!") yuuji@70: YaTeX-parent-file yuuji@70: (setq YaTeX-parent-file parent)) yuuji@70: t)) yuuji@70: ((symbolp cmd) yuuji@70: (cond yuuji@70: ((symbol-function cmd) yuuji@70: (funcall cmd src other))) yuuji@70: t))))))))) yuuji@59: yuuji@14: (defun YaTeX-on-section-command-p (command) yuuji@53: "Check if point is on the LaTeX command: COMMAND(regexp). yuuji@49: Return nil if point is not on it. Otherwise return the yuuji@49: number of argument position. yuuji@82: Section command name is stored in match-data #1. yuuji@82: Parsing information is stored to plist. yuuji@82: Macros name stored to propname 'command. yuuji@82: Macro's argument number stored to propname 'argc." yuuji@82: (let ((p (point)) md (parg 0) (argc 1) word (grouping 0) (i 0) yuuji@82: (ec+command (concat YaTeX-ec-regexp "\\(" command "\\)"))) yuuji@82: (setplist 'YaTeX-on-section-command-p nil) yuuji@53: (while (setq i (string-match "\\\\(" command i)) yuuji@53: (setq grouping (1+ grouping) i (+ i 2))) yuuji@7: (save-excursion yuuji@82: (if (looking-at ec+command) nil yuuji@49: (catch 'found ;caught value has no meaning yuuji@77: ;;(1) looking at current position yuuji@82: (and (looking-at command) yuuji@82: (save-excursion yuuji@82: (while (and (not (bobp)) (looking-at command)) yuuji@82: (forward-char -1)) yuuji@82: (looking-at ec+command)) yuuji@82: (goto-char (match-beginning 0)) yuuji@82: (throw 'found t)) yuuji@245: ;;If inside of parentheses, try to escape. yuuji@414: (unwind-protect yuuji@414: (progn yuuji@414: (set-syntax-table YaTeX-mode-syntax-table-nonparen) yuuji@414: (while (and (not (= (preceding-char) ?\])) ;skip optional arg yuuji@414: (condition-case err yuuji@414: (progn (up-list -1) t) yuuji@414: (error nil))))) yuuji@414: (set-syntax-table YaTeX-mode-syntax-table)) yuuji@245: (while (equal (preceding-char) ?\]) (backward-list)) yuuji@77: ;;(2) search command directly yuuji@77: (skip-chars-forward "^{}[]") yuuji@77: (and (YaTeX-re-search-active-backward yuuji@82: ec+command yuuji@82: YaTeX-comment-prefix nil t) yuuji@77: (>= p (match-beginning 0)) yuuji@77: (throw 'found (goto-char (match-beginning 0)))) yuuji@77: ;;(3) search token yuuji@77: (goto-char p) yuuji@49: (while t yuuji@49: (if (bobp) (throw 'found nil)) yuuji@49: (cond yuuji@49: ((looking-at YaTeX-ec-regexp) (throw 'found t)) yuuji@49: ((looking-at "[[{]") nil) yuuji@53: ((looking-at "[]}]")(condition-case nil (up-list -1) (error nil))) yuuji@49: (t (skip-chars-backward " \t\r\n"))) yuuji@49: (skip-chars-backward (concat "^ \t\r\n{}[]" YaTeX-ec-regexp)) yuuji@51: (or (bobp) (forward-char -1))))) yuuji@51: (if (and yuuji@82: (looking-at (concat ec+command yuuji@82: "\\(\\(\\[[^]]+\\]\\|([0-9,]+)\\)*\\)" ;optional arg yuuji@60: ;"[ \t\n\r]*{[^}]+}")) ;arg braces yuuji@60: "[ \t\n\r]*{[^}]*}")) ;arg braces yuuji@51: (not (YaTeX-lookup-table yuuji@51: (setq word (YaTeX-match-string 1)) 'singlecmd))) yuuji@46: (progn yuuji@49: (setq md (match-data)) yuuji@49: (skip-chars-forward "^{") yuuji@49: (if (<= (point) p) (setq parg (1+ parg))) yuuji@49: (setq argc yuuji@51: (or (car (cdr (YaTeX-lookup-table word 'section))) yuuji@49: argc)) yuuji@82: (put 'YaTeX-on-section-command-p 'argc argc) yuuji@82: (put 'YaTeX-on-section-command-p 'command argc) yuuji@53: (while (and (>= (setq argc (1- argc)) 0) yuuji@53: (progn (skip-chars-forward " \t\n\r") yuuji@53: (looking-at "{"))) yuuji@49: (forward-list 1) yuuji@53: (if (<= (point) p) (setq parg (1+ parg)))) yuuji@49: (store-match-data md) yuuji@53: (setq i (+ 2 grouping)) yuuji@53: (if (and (match-beginning i) yuuji@53: (>= p (match-beginning i)) (< p (match-end i))) yuuji@49: -1 ;return -1 if point is on optional arg yuuji@49: (if (< p (point)) parg)) yuuji@69: ))))) yuuji@5: yuuji@52: (defun YaTeX-on-maketitle-p () yuuji@52: "Check if point is on maketitle type commands. yuuji@52: Call this function after YaTeX-on-section-command-p." yuuji@52: (let ((p (point))) yuuji@52: (save-excursion yuuji@52: (or (= (char-after (point)) ?\\ ) yuuji@52: (progn yuuji@52: (skip-chars-backward yuuji@52: (concat "^" YaTeX-ec-regexp) (point-beginning-of-line)) yuuji@52: (or (bobp) (bolp) (backward-char 1)))) yuuji@52: (and (looking-at (concat YaTeX-ec-regexp YaTeX-TeX-token-regexp)) yuuji@52: (<= (match-beginning 0) p) yuuji@52: (> (match-end 0) p))))) yuuji@52: yuuji@5: (defun YaTeX-on-begin-end-p () yuuji@5: (save-excursion yuuji@77: (if (and (boundp 'in-leftright-p) in-leftright-p) yuuji@77: ;; Dirty workaround for YaTeX-goto-corresponding-leftright 2003/3/28 yuuji@77: (let ((md (match-data))) ; for safety yuuji@77: (if (looking-at YaTeX-ec-regexp) yuuji@77: nil ; stay here yuuji@77: (cond yuuji@77: ((looking-at "\\w") (skip-chars-backward "A-Za-z")) yuuji@77: ((looking-at "\\.()\\[\\]|") (forward-char -1))) yuuji@77: (if (equal (char-after (1- (point))) yuuji@77: (string-to-char YaTeX-ec)) yuuji@77: (forward-char -1)))) yuuji@82: ;(beginning-of-line) yuuji@82: (if (equal (char-after (point)) ?\\) nil ;stay here yuuji@82: (skip-chars-backward "^\n\\\\") yuuji@82: (or (bolp) (forward-char -1)))) yuuji@5: (re-search-forward yuuji@13: ;;"\\\\begin{\\([^}]+\\)}\\|\\\\end{\\([^}]+\\)}" yuuji@13: (concat yuuji@13: (YaTeX-replace-format-args yuuji@13: (regexp-quote YaTeX-struct-begin) yuuji@13: (concat "\\(" YaTeX-struct-name-regexp "\\)") "" "" "") yuuji@13: "\\|" yuuji@13: (YaTeX-replace-format-args yuuji@13: (regexp-quote YaTeX-struct-end) yuuji@70: (concat "\\(" YaTeX-struct-name-regexp "\\)") "" "" "") yuuji@70: "\\|\\(" yuuji@70: YaTeX-ec-regexp ;;"[][()]\\)" yuuji@412: "[\\]\\[]\\)" yuuji@70: ) yuuji@69: (point-end-of-line) t))) yuuji@6: yuuji@5: (defun YaTeX-on-includes-p () yuuji@5: (save-excursion yuuji@5: (beginning-of-line) yuuji@86: (re-search-forward "\\(\\(include[^}]*\\)\\|\\(input\\)\\){[^}]*}" yuuji@69: (point-end-of-line) t))) yuuji@6: yuuji@7: (defun YaTeX-on-comment-p (&optional sw) yuuji@22: "Return t if current line is commented out. yuuji@22: Optional argument SW t to treat all `%' lines as comment, yuuji@7: even if on `%#' notation." yuuji@7: (save-excursion yuuji@7: (beginning-of-line) yuuji@22: (skip-chars-forward "\\s ") yuuji@69: (looking-at (if sw "%" "%[^#]")))) yuuji@7: yuuji@5: (defun YaTeX-on-BEGIN-END-p () yuuji@5: (save-excursion yuuji@7: (let ((case-fold-search nil)) yuuji@5: (beginning-of-line) yuuji@69: (re-search-forward yuuji@69: "\\(%#BEGIN\\)\\|\\(%#END\\)" (point-end-of-line) t)))) yuuji@6: yuuji@7: (defun YaTeX-goto-corresponding-* (arg) yuuji@5: "Parse current line and call suitable function." yuuji@7: (interactive "P") yuuji@77: (let (mm) yuuji@77: (cond yuuji@77: ((YaTeX-goto-corresponding-label arg)) yuuji@77: ((YaTeX-goto-corresponding-environment)) yuuji@77: ((YaTeX-goto-corresponding-file-processor arg)) yuuji@77: ((YaTeX-goto-corresponding-file arg)) yuuji@77: ((YaTeX-goto-corresponding-BEGIN-END)) yuuji@77: ((and (setq mm (YaTeX-in-math-mode-p)) yuuji@77: (YaTeX-goto-corresponding-leftright))) yuuji@82: ((and ;;mm YaTeX-use-AMS-LaTeX yuuji@77: (YaTeX-goto-corresponding-paren))) yuuji@77: ;;((and (string-match yuuji@77: ;; YaTeX-equation-env-regexp ;to delay loading yuuji@77: ;; (or (YaTeX-inner-environment t) "document")) yuuji@77: ;; (YaTeX-goto-corresponding-leftright))) yuuji@350: ((YaTeX-goto-corresponding-viewer)) yuuji@77: (t (message "I don't know where to go."))))) yuuji@5: yuuji@51: (defun YaTeX-goto-corresponding-*-other-window (arg) yuuji@51: "Parse current line and call suitable function." yuuji@51: (interactive "P") yuuji@509: (YaTeX-goto-corresponding-* t)) yuuji@51: yuuji@5: (defun YaTeX-comment-region (alt-prefix) yuuji@22: "Comment out region by '%'. yuuji@22: If you call this function on the 'begin{}' or 'end{}' line, yuuji@22: it comments out whole environment" yuuji@5: (interactive "P") yuuji@4: (if (not (YaTeX-on-begin-end-p)) yuuji@482: (YaTeX-comment-region-sub yuuji@5: (if alt-prefix yuuji@394: (read-string-with-history "Insert prefix: ") yuuji@5: YaTeX-comment-prefix)) yuuji@482: (YaTeX-comment-uncomment-env 'YaTeX-comment-region-sub))) yuuji@4: yuuji@5: (defun YaTeX-uncomment-region (alt-prefix) yuuji@4: "Uncomment out region by '%'." yuuji@5: (interactive "P") yuuji@4: (if (not (YaTeX-on-begin-end-p)) yuuji@482: (YaTeX-uncomment-region-sub yuuji@394: (if alt-prefix (read-string-with-history "Remove prefix: ") yuuji@11: YaTeX-comment-prefix) yuuji@49: (region-beginning) (region-end) YaTeX-uncomment-once) yuuji@482: (YaTeX-comment-uncomment-env 'YaTeX-uncomment-region-sub))) yuuji@4: yuuji@4: (defun YaTeX-comment-uncomment-env (func) yuuji@4: "Comment or uncomment out one LaTeX environment switching function by FUNC." yuuji@482: (let (beg beg2 (p (point))) yuuji@49: (save-excursion yuuji@482: (beginning-of-line) yuuji@482: (setq beg (point)) yuuji@482: (save-match-data yuuji@482: (while (and (not (eobp)) yuuji@482: (not (eolp)) yuuji@482: (looking-at YaTeX-comment-prefix)) yuuji@482: (goto-char (match-end 0)))) yuuji@482: (setq beg2 (point)) yuuji@482: (YaTeX-goto-corresponding-environment) yuuji@482: (beginning-of-line) yuuji@482: (if (> p (point)) (setq beg (1+ beg2)) (forward-char 1)) yuuji@482: (funcall func YaTeX-comment-prefix beg (point) YaTeX-uncomment-once))) yuuji@45: (message "%sommented out current environment." yuuji@482: (if (string-match "uncom" (symbol-name func)) "Un-c" "C"))) yuuji@4: yuuji@3: (defun YaTeX-comment-paragraph () yuuji@3: "Comment out current paragraph." yuuji@3: (interactive) yuuji@3: (save-excursion yuuji@7: (cond yuuji@7: ((YaTeX-on-begin-end-p) yuuji@7: (beginning-of-line) yuuji@7: (insert YaTeX-comment-prefix) yuuji@7: (YaTeX-goto-corresponding-environment) yuuji@7: (beginning-of-line) yuuji@7: (insert YaTeX-comment-prefix)) yuuji@7: ((YaTeX-on-comment-p) yuuji@7: (message "Already commented out.")) yuuji@7: (t yuuji@4: (mark-paragraph) yuuji@7: (if (looking-at paragraph-separate) (forward-line 1)) yuuji@482: (YaTeX-comment-region-sub "%"))))) yuuji@3: yuuji@3: (defun YaTeX-uncomment-paragraph () yuuji@3: "Uncomment current paragraph." yuuji@3: (interactive) yuuji@3: (save-excursion yuuji@4: (if (YaTeX-on-begin-end-p) yuuji@68: (let ((p (point-marker))) yuuji@22: (YaTeX-goto-corresponding-environment) yuuji@11: (YaTeX-remove-prefix YaTeX-comment-prefix YaTeX-uncomment-once) yuuji@68: (goto-char p) yuuji@68: (YaTeX-remove-prefix YaTeX-comment-prefix YaTeX-uncomment-once) yuuji@68: (set-marker p nil)) yuuji@7: (if (YaTeX-on-comment-p) yuuji@7: (let*((fill-prefix "") yuuji@7: ;;append `^%' to head of paragraph delimiter. yuuji@7: (paragraph-start yuuji@7: (concat yuuji@61: "^$\\|^%\\(" YaTeX-paragraph-separate "\\)")) yuuji@49: (paragraph-separate paragraph-start)) yuuji@7: (mark-paragraph) yuuji@7: (if (not (bobp)) (forward-line 1)) yuuji@482: (YaTeX-uncomment-region-sub "%" nil nil YaTeX-uncomment-once)) yuuji@69: (message "This line is not a comment line."))))) yuuji@4: yuuji@4: (defun YaTeX-remove-prefix (prefix &optional once) yuuji@7: "Remove prefix on current line as far as prefix detected. But yuuji@4: optional argument ONCE makes deletion once." yuuji@4: (interactive "sPrefix:") yuuji@4: (beginning-of-line) yuuji@4: (while (re-search-forward (concat "^" prefix) (point-end-of-line) t) yuuji@4: (replace-match "") yuuji@69: (if once (end-of-line)))) yuuji@3: yuuji@22: (defun YaTeX-kill-some-pairs (predicate gofunc kill-contents) yuuji@22: "Kill some matching pair. yuuji@64: This function assumes that pairs occupy whole of each line where they resid." yuuji@7: (if (not (funcall predicate)) nil yuuji@64: (let ((b1 (match-beginning 0)) (e1 (match-end 0)) yuuji@64: b2 e2) yuuji@7: (save-excursion yuuji@7: (funcall gofunc) yuuji@64: (funcall predicate) ;get match data yuuji@64: (if (< (point) e1) ;if currently on begin-line yuuji@64: (progn yuuji@64: (setq b2 b1 e2 e1 yuuji@64: b1 (match-beginning 0) e1 (match-end 0)) yuuji@64: (goto-char e2)) ;goto end-line's end yuuji@64: (setq b2 (match-beginning 0) yuuji@64: e2 (match-end 0)) yuuji@64: (goto-char e2)) ;now e2 has surely end-line's end yuuji@64: (skip-chars-forward " \t") yuuji@64: (and (eolp) yuuji@64: (not (eobp)) yuuji@64: (setq e2 (1+ (point)))) yuuji@64: (if (not kill-contents) yuuji@64: (kill-region yuuji@64: (progn yuuji@64: (goto-char b2) yuuji@68: (skip-chars-backward " \t%") yuuji@64: (if (bolp) (point) b2)) yuuji@64: e2)) yuuji@64: (goto-char b1) yuuji@68: (skip-chars-backward " \t%") yuuji@64: (if (not kill-contents) yuuji@64: (progn yuuji@64: (kill-append yuuji@64: (buffer-substring yuuji@64: (setq b1 (if (bolp) (point) b1)) yuuji@64: (setq e1 yuuji@64: (progn yuuji@64: (goto-char e1) yuuji@64: (while (looking-at "{\\| \t") yuuji@64: (forward-list 1)) yuuji@64: (skip-chars-forward " \t") yuuji@64: (if (and (eolp) (not (eobp))) yuuji@64: (1+ (point)) yuuji@64: (point))))) yuuji@64: t) yuuji@64: (delete-region b1 e1)) yuuji@64: (kill-region yuuji@64: (if (bolp) (point) b1) yuuji@64: e2))) yuuji@69: t))) yuuji@5: yuuji@22: (defun YaTeX-kill-section-command (point kill-all) yuuji@82: "Kill section-type command at POINT leaving its last argument. yuuji@82: Non-nil for the second argument kill its last argument too." yuuji@82: (let ((cmd (get 'YaTeX-on-section-command-p 'command)) yuuji@82: (argc (get 'YaTeX-on-section-command-p 'argc)) yuuji@82: beg (end (make-marker))) yuuji@14: (save-excursion yuuji@22: (goto-char point) yuuji@22: (or (looking-at YaTeX-ec-regexp) yuuji@22: (progn yuuji@22: (skip-chars-backward (concat "^" YaTeX-ec-regexp)) yuuji@22: (forward-char -1))) yuuji@22: (setq beg (point)) yuuji@22: (skip-chars-forward "^{") yuuji@82: (while (> (setq argc (1- argc)) 0) yuuji@82: (skip-chars-forward "^{") yuuji@82: (forward-list 1)) yuuji@82: (kill-region beg (point)) yuuji@22: (forward-list 1) yuuji@22: (set-marker end (point)) yuuji@82: (if kill-all yuuji@82: (progn yuuji@82: (kill-append (buffer-substring beg end) nil) yuuji@82: (delete-region beg end)) yuuji@22: (goto-char beg) yuuji@82: (kill-append yuuji@82: (buffer-substring yuuji@82: (point) (progn (skip-chars-forward "^{" end) (1+ (point)))) yuuji@82: nil) yuuji@82: (delete-region beg (1+ (point))) yuuji@22: (goto-char end) yuuji@68: (set-marker end nil) yuuji@68: (kill-append (buffer-substring (point) (1- (point))) nil) yuuji@69: (delete-backward-char 1))))) yuuji@14: yuuji@22: (defun YaTeX-kill-paren (kill-contents) yuuji@22: "Kill parentheses leaving its contents. yuuji@22: But kill its contents if the argument KILL-CONTENTS is non-nil." yuuji@79: (interactive "P") yuuji@79: (let (p bsl (backslash-syntax (char-to-string (char-syntax ?\\))) yuuji@79: (md (match-data))) yuuji@79: (unwind-protect yuuji@79: (save-excursion yuuji@79: (modify-syntax-entry ?\\ " ") yuuji@79: (if (looking-at "\\s(\\|\\(\\s)\\)") yuuji@79: (progn yuuji@79: (if (match-beginning 1) yuuji@79: (up-list -1)) yuuji@79: (if (and (> (point) (point-min)) yuuji@79: (= (char-after (1- (point))) ?\\ )) yuuji@79: (setq p (1- (point)) bsl t) yuuji@79: (setq p (point))) yuuji@79: (forward-list 1) yuuji@79: ;(YaTeX-goto-open-paren t) yuuji@79: (if kill-contents (delete-region p (point)) yuuji@79: (backward-delete-char 1) yuuji@79: (cond yuuji@79: ((save-excursion yuuji@79: (forward-char -2) yuuji@79: (looking-at (concat YaTeX-ec-regexp "/"))) yuuji@79: (backward-delete-char 2)) yuuji@79: ((= (char-after (1- (point))) ?\\) yuuji@79: (backward-delete-char 1))) yuuji@79: (goto-char p) yuuji@79: (if (looking-at yuuji@79: (concat "{" YaTeX-ec-regexp yuuji@79: YaTeX-command-token-regexp "+" yuuji@79: "\\s +")) yuuji@79: (delete-region (point) (match-end 0)) yuuji@79: (delete-char 1) yuuji@79: (if bsl (delete-char 1)))) yuuji@79: t))) yuuji@79: (modify-syntax-entry ?\\ backslash-syntax) yuuji@79: (store-match-data md)))) yuuji@14: yuuji@22: (defvar YaTeX-read-environment-history nil "Holds history of environments.") yuuji@22: (put 'YaTeX-read-environment-history 'no-default t) yuuji@22: (defun YaTeX-read-environment (prompt &optional predicate must-match initial) yuuji@22: "Read a LaTeX environment name with completion." yuuji@49: (YaTeX-sync-local-table 'tmp-env-table) yuuji@51: (completing-read-with-history yuuji@51: prompt yuuji@51: (append tmp-env-table user-env-table env-table) yuuji@51: predicate must-match initial yuuji@69: 'YaTeX-read-environment-history)) yuuji@22: yuuji@22: (defvar YaTeX-read-section-history nil "Holds history of section-types.") yuuji@22: (put 'YaTeX-read-section-history 'no-default t) yuuji@22: (defun YaTeX-read-section (prompt &optional predicate initial) yuuji@22: "Read a LaTeX section-type command with completion." yuuji@49: (YaTeX-sync-local-table 'tmp-section-table) yuuji@51: (let ((minibuffer-completion-table yuuji@22: (append tmp-section-table user-section-table section-table))) yuuji@51: (read-from-minibuffer-with-history yuuji@51: prompt initial YaTeX-section-completion-map nil yuuji@69: 'YaTeX-read-section-history))) yuuji@22: yuuji@22: (defun YaTeX-read-section-with-overview () yuuji@22: "Read sectioning command with overview. yuuji@119: This function refers a local variable `source-window' in YaTeX-make-section, yuuji@119: because this function is called with no argument." yuuji@22: (interactive) yuuji@52: (require 'yatexsec) ;some case needs this yuuji@22: (if (> (minibuffer-depth) 1) yuuji@22: (error "Too many minibuffer levels for overview.")) yuuji@64: (let ((sw (selected-window)) yuuji@64: (minibuffer-max-depth nil) ; for XEmacs20 yuuji@64: (enable-recursive-minibuffers t) sect) yuuji@22: (unwind-protect yuuji@22: (progn yuuji@22: (select-window source-window) yuuji@22: (setq sect (YaTeX-read-section-in-minibuffer yuuji@22: "Sectioning(Up=C-p, Down=C-n, Help=?): " yuuji@22: YaTeX-sectioning-level (YaTeX-section-overview)))) yuuji@22: (select-window sw)) yuuji@72: (YaTeX-minibuffer-erase) yuuji@22: (insert sect) yuuji@69: (exit-minibuffer))) yuuji@22: yuuji@51: (defvar YaTeX-read-fontsize-history nil "Holds history of font designator.") yuuji@51: (put 'YaTeX-read-fontsize-history 'no-default t) yuuji@22: (defun YaTeX-read-fontsize (prompt &optional predicate must-match initial) yuuji@22: "Read a LaTeX font changing command with completion." yuuji@49: (YaTeX-sync-local-table 'tmp-fontsize-table) yuuji@51: (completing-read-with-history yuuji@22: prompt (append tmp-fontsize-table user-fontsize-table fontsize-table) yuuji@69: predicate must-match initial 'YaTeX-read-fontsize-history)) yuuji@5: yuuji@5: (defun YaTeX-change-environment () yuuji@5: "Change the name of environment." yuuji@5: (interactive) yuuji@5: (if (not (YaTeX-on-begin-end-p)) nil yuuji@5: (save-excursion yuuji@179: (let (p env newenv (m1 (match-beginning 1)) (m2 (match-beginning 2))) yuuji@165: (setq env (if m1 (YaTeX-buffer-substring m1 (match-end 1)) yuuji@165: (YaTeX-buffer-substring m2 (match-end 2)))) yuuji@11: (goto-char (match-beginning 0)) yuuji@5: (set-mark-command nil) yuuji@5: (YaTeX-goto-corresponding-environment) yuuji@5: (setq newenv (YaTeX-read-environment yuuji@5: (format "Change environment `%s' to: " env))) yuuji@13: (cond yuuji@13: ((string= newenv "") (message "Change environment cancelled.")) yuuji@13: ((string= newenv env) (message "No need to change.")) yuuji@13: (t yuuji@5: (search-forward (concat "{" env) (point-end-of-line) t) yuuji@68: (replace-match (concat "{" newenv) t) yuuji@5: (exchange-point-and-mark) yuuji@5: (search-forward (concat "{" env) (point-end-of-line) t) yuuji@68: (replace-match (concat "{" newenv) t))) yuuji@69: t)))) yuuji@5: yuuji@22: (defun YaTeX-change-section () yuuji@22: "Change section-type command." yuuji@5: (interactive) yuuji@49: (let*((where (YaTeX-on-section-command-p YaTeX-command-token-regexp)) yuuji@70: (p (point)) (cmd (YaTeX-match-string 1)) yuuji@70: (beg (make-marker)) (end (make-marker)) old new) yuuji@49: (if (null where) nil yuuji@70: (unwind-protect yuuji@119: (let ((source-window (selected-window))) yuuji@70: (cond yuuji@70: ((equal where 0);;if point is on section command yuuji@70: (set-marker beg (match-beginning 1)) yuuji@70: (set-marker end (match-end 1)) yuuji@70: (goto-char beg) ;beginning of the command yuuji@70: (setq new (YaTeX-read-section yuuji@169: (format "Change `%s' to: " cmd) nil) yuuji@169: old cmd)) yuuji@49: yuuji@70: ((= where -1);;if point is on a optional parameter yuuji@70: (set-marker beg (match-beginning 2)) yuuji@70: (skip-chars-forward "^{") yuuji@70: (set-marker end (point)) yuuji@70: (goto-char p) yuuji@70: (setq new yuuji@70: (if (fboundp (intern-soft (concat YaTeX-addin-prefix cmd))) yuuji@70: (YaTeX-addin cmd) yuuji@70: (concat "[" yuuji@169: (read-string yuuji@169: (format "Change `%s' to: " yuuji@169: (setq old (YaTeX-buffer-substring yuuji@169: (1+ beg) (1- end))))) yuuji@70: "]")))) yuuji@49: yuuji@70: ((> where 0);;if point is in arguments' braces yuuji@70: (or (looking-at "{") yuuji@70: (progn (skip-chars-backward "^{") (forward-char -1))) yuuji@70: (set-marker beg (1+ (point))) yuuji@70: (forward-list 1) yuuji@70: (forward-char -1) yuuji@70: (set-marker end (point)) yuuji@165: (setq old (YaTeX-buffer-substring beg end)) yuuji@70: (goto-char p) yuuji@70: (if (> (length old) 40) yuuji@70: (setq old (concat (substring old 0 12) "..." yuuji@70: (substring old -12)))) yuuji@70: (setq new yuuji@70: (if (intern-soft (concat "YaTeX::" cmd)) yuuji@70: (funcall (intern-soft (concat "YaTeX::" cmd)) where) yuuji@70: (read-string (format "Change `%s' to: " old))))) yuuji@70: ) ;cond yuuji@169: (if (string= old new) yuuji@169: nil ;do not replace yuuji@169: (delete-region beg end) yuuji@169: (goto-char beg) yuuji@169: (insert-before-markers new))) yuuji@70: (set-marker beg nil) yuuji@70: (set-marker end nil)) yuuji@49: ;;(goto-char (marker-position p)) yuuji@69: new))) yuuji@49: yuuji@49: (defun YaTeX-change-fontsize () yuuji@49: "Change large-type command." yuuji@49: (let ((lt (append tmp-fontsize-table user-fontsize-table fontsize-table)) yuuji@49: (p (point)) large old new beg end) yuuji@49: ;;(and (looking-at "}") (up-list -1)) yuuji@49: ;;(and (looking-at "{") (forward-char 1)) yuuji@49: ;;Is above convenient? yuuji@49: (save-excursion yuuji@49: (or (looking-at YaTeX-ec-regexp) yuuji@49: (progn yuuji@49: (skip-chars-backward (concat "^" YaTeX-ec-regexp)) yuuji@49: (forward-char -1))) yuuji@49: (cond yuuji@49: ((and yuuji@49: (looking-at yuuji@49: (concat YaTeX-ec-regexp "\\(" YaTeX-TeX-token-regexp "\\)")) yuuji@49: (< p (match-end 0)) yuuji@49: (assoc (setq old (YaTeX-match-string 1)) lt)) yuuji@49: (goto-char p) yuuji@49: (setq beg (match-beginning 1) end (match-end 1) ;save match position yuuji@49: new (completing-read yuuji@49: (format "Change font/size `%s' to : " old) lt)) yuuji@22: (delete-region beg end) yuuji@49: (goto-char beg) yuuji@22: (insert-before-markers new) yuuji@49: new) yuuji@49: (t nil) yuuji@69: )))) yuuji@22: yuuji@52: (defun YaTeX-change-math-image () yuuji@52: "Change with image completion." yuuji@52: (let (maketitle memberp beg end) yuuji@52: (if (and (YaTeX-on-maketitle-p) yuuji@52: (progn yuuji@52: (setq maketitle (substring (YaTeX-match-string 0) 1)) yuuji@52: (setq memberp (YaTeX-math-member-p maketitle)))) yuuji@291: (let*((last-command-char (string-to-char (car memberp))) yuuji@291: (last-command-event last-command-char)) yuuji@52: (setq beg (match-beginning 0) end (match-end 0)) yuuji@52: (delete-region beg end) yuuji@52: (YaTeX-math-insert-sequence t (cdr memberp)))))) yuuji@52: yuuji@22: (defun YaTeX-kill-* (&optional arg) yuuji@22: "Parse current line and call suitable function. yuuji@22: Non-nil for ARG kills its contents too." yuuji@22: (interactive "P") yuuji@5: (cond yuuji@5: ((YaTeX-kill-some-pairs 'YaTeX-on-begin-end-p yuuji@22: 'YaTeX-goto-corresponding-environment arg)) yuuji@5: ((YaTeX-kill-some-pairs 'YaTeX-on-BEGIN-END-p yuuji@22: 'YaTeX-goto-corresponding-BEGIN-END arg)) yuuji@32: ((YaTeX-on-section-command-p YaTeX-command-token-regexp);on any command yuuji@22: (YaTeX-kill-section-command (match-beginning 0) arg)) yuuji@22: ((YaTeX-kill-paren arg)) yuuji@407: ((and (fboundp 'overlays-at) yuuji@407: (member YaTeX-on-the-fly-overlay (overlays-at (point)))) yuuji@407: (YaTeX-on-the-fly-cancel)) yuuji@69: (t (message "I don't know what to kill.")))) yuuji@5: yuuji@5: (defun YaTeX-change-* () yuuji@5: "Parse current line and call suitable function." yuuji@5: (interactive) yuuji@5: (cond yuuji@82: ((YaTeX-change-parentheses)) yuuji@5: ((YaTeX-change-environment)) yuuji@22: ((YaTeX-change-section)) yuuji@49: ((YaTeX-change-fontsize)) yuuji@52: ((YaTeX-change-math-image)) yuuji@69: (t (message "I don't know what to change.")))) yuuji@5: yuuji@7: ;;; yuuji@48: ;Check availability of add-in functions yuuji@7: ;;; yuuji@7: (cond yuuji@48: ((featurep 'yatexadd) nil) ;Already provided. yuuji@48: ((progn (load "yatexadd" t) (featurep 'yatexadd)) nil) yuuji@7: (t (message "YaTeX add-in functions not supplied."))) yuuji@7: yuuji@5: (defun YaTeX-addin (name) yuuji@5: "Check availability of addin function and call it if exists." yuuji@7: (if (and (not (get 'YaTeX-generate 'disabled)) yuuji@57: (intern-soft (concat YaTeX-addin-prefix name)) yuuji@57: (fboundp (intern-soft (concat YaTeX-addin-prefix name)))) yuuji@57: (let ((s (funcall (intern (concat YaTeX-addin-prefix name))))) yuuji@7: (if (stringp s) s "")) yuuji@69: "")) ;Add in function is not bound. yuuji@69: yuuji@7: yuuji@22: (defun YaTeX-on-item-p (&optional point) yuuji@22: "Return t if POINT (default is (point)) is on \\item." yuuji@22: (let ((p (or point (point)))) yuuji@22: (save-excursion yuuji@22: (goto-char p) yuuji@22: (end-of-line) yuuji@22: (setq p (point)) yuuji@22: (re-search-backward YaTeX-paragraph-delimiter nil t) yuuji@69: (re-search-forward YaTeX-item-regexp p t)))) yuuji@22: yuuji@49: (defun YaTeX-in-verb-p (&optional point) yuuji@49: "Check if POINT is in verb or verb*. Default of POINT is (point)." yuuji@49: (setq point (or point (point))) yuuji@7: (save-excursion yuuji@70: (let ((md (match-data))) yuuji@70: (goto-char point) yuuji@70: (unwind-protect yuuji@70: (if (not (re-search-backward yuuji@70: (concat YaTeX-ec-regexp yuuji@70: "\\(" YaTeX-verb-regexp "\\)" yuuji@70: "\\([^-A-Za-z_*]\\)") yuuji@70: (point-beginning-of-line) t)) yuuji@70: nil yuuji@70: (goto-char (match-end 2)) yuuji@70: (skip-chars-forward yuuji@165: (concat "^" (YaTeX-buffer-substring yuuji@165: (match-beginning 2) (match-end 2)))) yuuji@70: (and (< (match-beginning 2) point) (< (1- point) (point)))) yuuji@70: (store-match-data md))))) yuuji@49: yuuji@49: (defun YaTeX-literal-p (&optional point) yuuji@49: "Check if POINT is in verb or verb* or verbatime environment family. yuuji@49: Default of POINT is (point)." yuuji@70: (let ((md (match-data))) yuuji@70: (unwind-protect yuuji@70: (cond yuuji@70: ((equal YaTeX-ec "\\") ;maybe LaTeX yuuji@70: (save-excursion yuuji@70: (and point (goto-char point)) yuuji@70: (or (YaTeX-in-verb-p (point)) yuuji@70: (and (not (looking-at "\\\\end{verb")) yuuji@70: (YaTeX-quick-in-environment-p yuuji@70: YaTeX-verbatim-environments)))))) yuuji@70: (store-match-data md)))) yuuji@5: yuuji@22: ;; Filling \item yuuji@46: (defun YaTeX-remove-trailing-comment (start end) yuuji@46: "Remove trailing comment from START to end." yuuji@46: (save-excursion yuuji@60: (let ((trcom (concat YaTeX-comment-prefix "$"))) yuuji@46: (goto-char start) yuuji@46: (while (re-search-forward trcom end t) yuuji@54: (if (/= (char-after (1- (match-beginning 0))) ?\\ ) yuuji@69: (replace-match "\\1")))))) yuuji@5: yuuji@82: (defvar YaTeX-itemize-withlabel-max-indent-depth 8) yuuji@58: (defun YaTeX-get-item-info (&optional recent thisenv) yuuji@51: "Return the list of the beginning of \\item and column of its item. yuuji@53: If it seems to be outside of itemizing environment, just return nil. yuuji@58: Non-nil for optional argument RECENT refers recent \\item. yuuji@58: Optional second argument THISENV omits calling YaTeX-inner-environment." yuuji@22: (save-excursion yuuji@82: (let* ((p (point)) env e0 c cc md yuuji@58: (bndry (and (setq env (or thisenv (YaTeX-inner-environment t))) yuuji@82: (get 'YaTeX-inner-environment 'point)))) yuuji@22: (end-of-line) yuuji@53: (if (if recent yuuji@82: (catch 'found yuuji@82: (while (YaTeX-re-search-active-backward yuuji@82: YaTeX-item-regexp YaTeX-comment-prefix bndry t) yuuji@82: (setq md (match-data)) yuuji@82: (YaTeX-inner-environment t) yuuji@82: (store-match-data md) yuuji@82: (if (= bndry (get 'YaTeX-inner-environment 'point)) yuuji@82: (throw 'found t)))) yuuji@53: (goto-char bndry) yuuji@53: (YaTeX-re-search-active-forward yuuji@53: YaTeX-item-regexp YaTeX-comment-prefix p t)) yuuji@51: (progn yuuji@53: (goto-char (match-end 0)) yuuji@53: ;(setq c (current-column)) yuuji@58: (if (string-match "desc" env) yuuji@58: (setq c 6) yuuji@82: (setq cc (current-column)) yuuji@58: (if (equal (following-char) ?\[) (forward-list 1)) yuuji@82: (if (< (- (current-column) cc) yuuji@82: YaTeX-itemize-withlabel-max-indent-depth) yuuji@82: (setq c 0) yuuji@82: (move-to-column cc) yuuji@82: (setq c YaTeX-itemize-withlabel-max-indent-depth))) yuuji@51: (skip-chars-forward " \t" (point-end-of-line)) yuuji@69: (list (point-beginning-of-line) (+ c (current-column)))))))) yuuji@22: yuuji@5: (defun YaTeX-fill-item () yuuji@5: "Fill item in itemize environment." yuuji@5: (interactive) yuuji@5: (save-excursion yuuji@51: (let* ((p (point)) yuuji@51: (item-term (concat yuuji@58: "\\(^[ \t]*$\\)\\|" YaTeX-item-regexp "\\|\\(" yuuji@53: YaTeX-ec-regexp "\\(begin\\|end\\)\\)")) yuuji@51: ;;This value depends on LaTeX. yuuji@51: fill-prefix start col yuuji@53: (info (YaTeX-get-item-info t))) yuuji@55: (if (null info) nil ;not on \item, do nothing yuuji@22: (setq start (car info) yuuji@22: col (car (cdr info))) yuuji@55: (save-excursion yuuji@55: (if (re-search-backward "^\\s *$" start t) yuuji@55: ;;if separated from \item line, isolate this block yuuji@55: (progn yuuji@55: (setq start (1+ (match-end 0))) yuuji@55: (goto-char start) yuuji@55: (skip-chars-forward " \t") yuuji@55: (delete-region (point) start) ;is this your favor??? yuuji@55: (indent-to col)))) yuuji@46: (beginning-of-line) yuuji@46: (if (<= (save-excursion yuuji@46: (re-search-forward yuuji@58: (concat "\\\\end{\\|\\\\begin{\\|^[ \t]*$") nil t) yuuji@46: (match-beginning 0)) yuuji@46: p) yuuji@51: (progn (message "Not on itemize.") nil) yuuji@51: (end-of-line) yuuji@51: (newline) yuuji@51: (indent-to col) yuuji@51: (setq fill-prefix yuuji@165: (YaTeX-buffer-substring (point-beginning-of-line)(point))) yuuji@51: (beginning-of-line) yuuji@53: (delete-region (point) (progn (forward-line 1) (point))) yuuji@51: (re-search-forward item-term nil 1) yuuji@51: (YaTeX-remove-trailing-comment start (point)) yuuji@51: (beginning-of-line) yuuji@51: (push-mark (point) t) yuuji@51: (goto-char start) yuuji@51: (forward-line 1) yuuji@51: (while (< (point) (mark)) yuuji@51: (delete-region (point) (progn (skip-chars-forward " \t") (point))) yuuji@51: (forward-line 1)) yuuji@51: (fill-region-as-paragraph start (mark)) yuuji@51: (if NTT-jTeX yuuji@51: (while (progn(forward-line -1)(end-of-line) (> (point) start)) yuuji@51: (insert ?%))) yuuji@69: (pop-mark)))))) yuuji@5: yuuji@51: (defun YaTeX-fill-paragraph (arg) yuuji@51: "YaTeX adjustment function for fill-paragraph. yuuji@51: *Protect \\verb from unexpected broken up." yuuji@51: (interactive "P") yuuji@51: (cond yuuji@51: ((not (eq major-mode 'yatex-mode)) (fill-paragraph arg)) yuuji@51: ((YaTeX-quick-in-environment-p YaTeX-fill-inhibit-environments) nil) yuuji@68: ((YaTeX-in-math-mode-p) nil) yuuji@51: (t yuuji@51: (save-excursion yuuji@82: (let*((verbrex (concat YaTeX-ec-regexp yuuji@51: "\\(" YaTeX-verb-regexp "\\)" ;match#1 yuuji@51: "\\(.\\).*\\(\\2\\)")) ;match #2 and #3 yuuji@82: (tilderex (concat "\\(" yuuji@82: YaTeX-kanji-regexp "~" yuuji@82: "\\)" YaTeX-ec-regexp yuuji@82: "\\|\\(" yuuji@82: "~" YaTeX-kanji-regexp yuuji@82: "\\)")) yuuji@82: (p (point)) ii end poslist spacelist lenlist b e n yuuji@82: (fill-prefix fill-prefix) yuuji@82: (inenv (or (YaTeX-inner-environment t) "document")) yuuji@82: (border (get 'YaTeX-inner-environment 'point))) yuuji@52: (cond yuuji@52: ((save-excursion (beginning-of-line) ;if point is on the first yuuji@52: (setq end (point)) ;non-whitespace char yuuji@52: (skip-chars-forward " \t") yuuji@52: (equal (point) p)) yuuji@165: (setq fill-prefix (YaTeX-buffer-substring p end))) yuuji@53: ((and ;;(not YaTeX-emacs-19) yuuji@82: (string-match YaTeX-itemizing-env-regexp inenv) yuuji@58: (setq ii (YaTeX-get-item-info))) yuuji@58: (save-excursion yuuji@58: (beginning-of-line) yuuji@58: (indent-to-column (car (cdr ii))) yuuji@58: (setq fill-prefix yuuji@165: (YaTeX-buffer-substring (point) (point-beginning-of-line))) yuuji@58: (delete-region (point) (progn (beginning-of-line) (point)))))) yuuji@82: (cond yuuji@82: ((string-match "tabular" inenv) yuuji@82: (let ((b (point-beginning-of-line)) yuuji@82: (e (point-end-of-line))) yuuji@82: (if (re-search-backward yuuji@82: "&\\|\\\\\\\\\\|\\\\\\(begin\\|end\\){" border t) yuuji@82: (setq b (if (match-beginning 1) yuuji@82: (progn (forward-line 1) (point)) yuuji@82: (point-beginning-of-line)))) yuuji@82: (goto-char p) yuuji@82: (if (re-search-forward yuuji@82: "&\\|\\\\\\\\\\|\\\\\\(end\\|begin\\){" nil t) yuuji@82: (setq e (if (match-beginning 1) yuuji@82: (progn (forward-line -1) yuuji@82: (point-end-of-line)) yuuji@82: (match-beginning 0)))) yuuji@82: (set-mark e) yuuji@82: (goto-char b))) yuuji@82: (t yuuji@82: (mark-paragraph))) yuuji@51: (save-restriction yuuji@51: (narrow-to-region (region-beginning) (region-end)) yuuji@52: (YaTeX-remove-trailing-comment (point-min) (point-max)) yuuji@82: ;; First, replace spaces in verb to _ temporarily. yuuji@58: (goto-char (point-min)) yuuji@51: (while (YaTeX-re-search-active-forward yuuji@58: verbrex YaTeX-comment-prefix (point-max) t) yuuji@51: (setq end (match-beginning 3)) yuuji@51: (goto-char (match-beginning 2)) yuuji@51: (while (re-search-forward "\\s " end t) yuuji@51: (setq poslist (cons (make-marker) poslist) yuuji@82: spacelist (cons (preceding-char) spacelist) yuuji@82: lenlist (cons 1 lenlist)) yuuji@51: (replace-match "_") yuuji@51: (set-marker (car poslist) (match-beginning 0)))) yuuji@82: ;; Second, replace "表~\ref{...}" to "\\\ref{...}" yuuji@82: (goto-char (point-min)) yuuji@82: (while (YaTeX-re-search-active-forward yuuji@82: tilderex YaTeX-comment-prefix (point-max) t) yuuji@82: (if (match-beginning 1) yuuji@82: (setq b (match-beginning 1) e (match-end 1) n 1) yuuji@82: (setq b (match-beginning 2) e (match-end 2) n 2)) yuuji@82: (setq poslist (cons (make-marker) poslist) yuuji@82: spacelist (cons (YaTeX-match-string n) spacelist) yuuji@82: lenlist (cons 2 lenlist)) yuuji@82: (goto-char (match-beginning 0)) yuuji@82: (delete-region (point) e) yuuji@82: (insert YaTeX-ec YaTeX-ec) ;set-marker should be here yuuji@82: (set-marker (car poslist) b)) yuuji@58: ;;(fill-paragraph arg) yuuji@58: (fill-region-as-paragraph (point-min) (point-max) arg) yuuji@51: (while spacelist yuuji@68: (goto-char (car poslist)) yuuji@68: (set-marker (car poslist) nil) yuuji@82: (and (eolp) (skip-chars-forward "\n\t ")) yuuji@82: (delete-char (car lenlist)) yuuji@51: (insert (car spacelist)) yuuji@82: (setq spacelist (cdr spacelist) yuuji@82: poslist (cdr poslist) yuuji@82: lenlist (cdr lenlist))) yuuji@52: (goto-char (point-min)) yuuji@52: (forward-word 1) yuuji@52: (beginning-of-line) yuuji@82: (while (re-search-forward "\\\\\\([a-z]*ref\\|cite\\){" nil t) yuuji@59: (if (< (point-end-of-line) yuuji@59: (save-excursion (forward-char -1) (forward-list 1) (point))) yuuji@73: (progn (end-of-line) yuuji@73: (if (save-excursion yuuji@73: (backward-word 1) yuuji@73: (looking-at "[^0-9A-z!-)]")) yuuji@73: (insert YaTeX-comment-prefix))))) yuuji@82: ;; Nonbreak space `~' yuuji@82: (goto-char (point-min)) yuuji@82: (while (YaTeX-re-search-active-forward yuuji@82: "~\\(\\s *\\)$" YaTeX-comment-prefix (point-max) t) yuuji@82: (delete-region (match-beginning 1) (match-end 1)) yuuji@82: (insert YaTeX-comment-prefix)) yuuji@59: (goto-char (point-min)) yuuji@73: (if (and NTT-jTeX (looking-at "[ \t]\\|^$")) yuuji@52: (progn yuuji@52: (goto-char (point-min)) yuuji@52: (while (not (eobp)) yuuji@52: (end-of-line) yuuji@52: (or (bolp) yuuji@52: (save-excursion yuuji@52: (backward-word 1) yuuji@73: (looking-at "[0-9A-z!-)]")) ;is not japanese string yuuji@59: (progn (setq p (point)) (insert YaTeX-comment-prefix))) yuuji@52: (forward-line 1)) yuuji@52: (goto-char p) yuuji@61: (if (looking-at "%") (delete-char 1)) ;remove last inserted `%' yuuji@69: )))))))) yuuji@51: yuuji@52: (if (fboundp 'YaTeX-saved-indent-new-comment-line) nil yuuji@52: (fset 'YaTeX-saved-indent-new-comment-line yuuji@52: (symbol-function 'indent-new-comment-line)) yuuji@52: (fset 'indent-new-comment-line 'YaTeX-indent-new-comment-line)) yuuji@52: yuuji@58: (defun YaTeX-indent-new-comment-line (&optional soft) yuuji@58: "Tuned `indent-new-comment-line' function for yatex. yuuji@58: See the documentation of `YaTeX-saved-indent-new-comment-line'." yuuji@69: (interactive) yuuji@52: (cond yuuji@60: ((or (not (memq major-mode '(yatex-mode yahtml-mode))) yuuji@53: (string-match yuuji@53: "document" yuuji@53: (or (and (boundp 'inenv) inenv) yuuji@53: (or (YaTeX-inner-environment t) "document")))) yuuji@58: (apply 'YaTeX-saved-indent-new-comment-line (if soft (list soft)))) yuuji@60: ; ((and (eq major-mode 'yahtml-mode) yuuji@60: ; (string-match yuuji@60: ; "^[Pp][Rr][Ee]" (yahtml-inner-environment-but "^[Aa]\\b" t))) yuuji@60: ; (yahtml-indent-new-commnet-line)) yuuji@61: ((and (eq major-mode 'yatex-mode) ;1997/2/4 yuuji@61: (YaTeX-in-math-mode-p)) nil) ;1996/12/30 yuuji@58: (t (let (fill-prefix) yuuji@69: (apply 'YaTeX-saved-indent-new-comment-line (if soft (list soft))))))) yuuji@51: yuuji@5: (defun YaTeX-fill-* () yuuji@5: "Fill paragraph according to its condition." yuuji@5: (interactive) yuuji@5: (cond yuuji@5: ((YaTeX-fill-item)) yuuji@69: )) yuuji@5: yuuji@22: ;; Accent completion yuuji@5: (defun YaTeX-read-accent-char (x) yuuji@5: "Read char in accent braces." yuuji@5: (let ((c (read-char))) yuuji@5: (concat yuuji@5: (if (and (or (= c ?i) (= c ?j)) yuuji@5: (not (string-match (regexp-quote x) "cdb"))) yuuji@5: "\\" "") yuuji@69: (char-to-string c)))) yuuji@5: yuuji@5: (defun YaTeX-make-accent () yuuji@5: "Make accent usage." yuuji@5: (interactive) yuuji@5: (message "1:` 2:' 3:^ 4:\" 5:~ 6:= 7:. u v H t c d b") yuuji@5: (let ((c (read-char))(case-fold-search nil)) yuuji@5: (setq c (cond ((and (> c ?0) (< c ?8)) yuuji@5: (substring "`'^\"~=." (1- (- c ?0)) (- c ?0))) yuuji@5: ((= c ?h) "H") yuuji@5: (t (char-to-string c)))) yuuji@5: (if (not (string-match c "`'^\"~=.uvHtcdb")) nil yuuji@5: (insert "\\" c "{}") yuuji@5: (backward-char 1) yuuji@5: (insert (YaTeX-read-accent-char c)) yuuji@5: (if (string= c "t") (insert (YaTeX-read-accent-char c))) yuuji@69: (forward-char 1)))) yuuji@5: yuuji@359: ;; Field skip in tabular yuuji@359: (defun YaTeX-forward-field (arg) yuuji@359: "Move forward to the ARGth next column field of table." yuuji@359: (interactive "p") yuuji@359: (if (< arg 0) yuuji@359: (YaTeX-backward-field (- arg)) yuuji@359: (let ((ep (save-excursion (YaTeX-end-of-environment) (point))) yuuji@359: (wc (car (YaTeX-array-what-column-internal)))) yuuji@359: (while (>= (setq arg (1- arg)) 0) yuuji@359: (skip-chars-forward "^&\\\\") yuuji@359: (while (and (not (eobp)) yuuji@359: (> ep (point)) yuuji@359: (looking-at "\\&\\|\\\\") yuuji@359: (= wc (car (YaTeX-array-what-column-internal)))) yuuji@362: (skip-chars-forward "&" ep) yuuji@362: (while (looking-at "[\n\t ]+\\|\\\\\\\\\\|\\\\.line\\>") yuuji@362: (goto-char (match-end 0)) yuuji@362: )))))) yuuji@359: yuuji@359: (defun YaTeX-backward-field (arg) yuuji@359: "Move backward to the ARGth next column field of table." yuuji@359: (interactive "p") yuuji@359: (if (< arg 0) yuuji@359: (YaTeX-forward-field (- arg)) yuuji@359: (let ((bp (save-excursion yuuji@359: (YaTeX-beginning-of-environment) yuuji@359: (point-end-of-line))) yuuji@359: (wc (car (YaTeX-array-what-column-internal)))) yuuji@359: (while (>= (setq arg (1- arg)) 0) yuuji@359: (skip-chars-backward "^&\\\\" bp) yuuji@359: (while (and (not (bobp)) yuuji@359: (< bp (point)) yuuji@359: (memq (preceding-char) '(?& ?\\)) yuuji@359: (= wc (car (YaTeX-array-what-column-internal)))) yuuji@359: (skip-chars-backward "&\\\\" bp) yuuji@359: (skip-chars-backward "\n\t " bp)) yuuji@359: (if (eolp) (skip-chars-forward "^&\\\\")))))) yuuji@359: yuuji@22: ;; Indentation yuuji@22: (defun YaTeX-current-indentation () yuuji@22: "Return the indentation of current environment." yuuji@22: (save-excursion yuuji@53: ;;(beginning-of-line) yuuji@53: (if (YaTeX-beginning-of-environment t) yuuji@53: (goto-char (get 'YaTeX-inner-environment 'point)) yuuji@53: (forward-line -1) yuuji@53: (beginning-of-line) yuuji@53: (skip-chars-forward " \t")) yuuji@69: (current-column))) yuuji@22: yuuji@53: (defun YaTeX-previous-line-indentation () yuuji@53: (save-excursion yuuji@53: (forward-line -1) yuuji@53: (skip-chars-forward " \t") yuuji@53: (current-column))) yuuji@53: yuuji@82: (defvar YaTeX-noindent-env-regexp "verbatim\\*?\\|alltt" yuuji@82: "*Regexp of environment names that should begin with no indentation. yuuji@82: All verbatime-like environment name should match with.") yuuji@22: (defun YaTeX-indent-line () yuuji@22: "Indent corrent line referrin current environment." yuuji@22: (interactive) yuuji@48: (let ((indent-relative yuuji@48: (function yuuji@51: (lambda (&optional additional) yuuji@48: (YaTeX-reindent yuuji@51: (+ (YaTeX-current-indentation) yuuji@51: (or additional 0) yuuji@51: YaTeX-environment-indent))))) yuuji@82: sect depth iteminfo (p (point)) pp (peol (point-end-of-line)) begend yuuji@52: ;;inenv below is sometimes defined in YaTeX-indent-new-comment-line yuuji@52: (inenv (or (and (boundp 'inenv) inenv) (YaTeX-inner-environment t)))) yuuji@52: ;;(if NTT-jTeX ;;Do you need this section? yuuji@52: ;; (save-excursion yuuji@52: ;; (end-of-line) yuuji@52: ;; (let ((p (point))) yuuji@52: ;; (forward-line -1) yuuji@52: ;; (end-of-line) yuuji@52: ;; (or (= p (point)) yuuji@52: ;; (progn (backward-char (length YaTeX-comment-prefix)) yuuji@52: ;; (not (looking-at (regexp-quote YaTeX-comment-prefix)))) yuuji@52: ;; (progn yuuji@52: ;; (skip-chars-backward YaTeX-comment-prefix) yuuji@52: ;; (kill-line)))))) yuuji@52: (or inenv (setq inenv "document")) ;is the default environment yuuji@48: (cond yuuji@82: ((and yuuji@82: (prog1 (YaTeX-on-begin-end-p) yuuji@82: (setq begend (match-beginning 0))) yuuji@82: (or (match-beginning 2) ;if \end yuuji@82: (and (match-beginning 3) ;if \) \] yuuji@82: (= (char-syntax (char-after (1+ (match-beginning 3)))) ?\))))) yuuji@70: (YaTeX-reindent yuuji@70: (save-excursion yuuji@70: (YaTeX-goto-corresponding-environment) yuuji@70: (current-column)))) yuuji@82: ;; on the begining of verbatime line, remove all indentation yuuji@82: ((and begend ;; match-beginning 0 of \begin yuuji@82: YaTeX-noindent-env-regexp yuuji@82: (stringp YaTeX-noindent-env-regexp) yuuji@82: (save-excursion yuuji@82: (and ;; if the \begin is the first declaration of this line yuuji@82: (progn (beginning-of-line) (skip-chars-forward " \t") yuuji@82: (= begend (point))) yuuji@82: (progn yuuji@82: (goto-char begend) yuuji@82: (looking-at yuuji@82: (concat YaTeX-ec-regexp yuuji@82: "begin{\\(" YaTeX-noindent-env-regexp "\\)}")))))) yuuji@82: (save-excursion yuuji@82: (goto-char begend) yuuji@82: (delete-region (point) (point-beginning-of-line)))) yuuji@53: ((string-match YaTeX-equation-env-regexp inenv) yuuji@68: (YaTeX-indent-line-equation)) ;autoload-ed from yatexenv yuuji@52: (;(YaTeX-in-environment-p '("itemize" "enumerate" "description" "list")) yuuji@52: (string-match YaTeX-itemizing-env-regexp inenv) yuuji@52: ;;(YaTeX-on-item-p) ?? yuuji@53: ;;(setq iteminfo (YaTeX-get-item-info t)) yuuji@53: (if (save-excursion yuuji@51: (beginning-of-line) yuuji@53: (re-search-forward YaTeX-item-regexp peol t)) yuuji@68: (progn yuuji@68: (save-excursion yuuji@68: (goto-char (1+ (match-beginning 0))) yuuji@68: (setq depth yuuji@68: (* YaTeX-environment-indent yuuji@68: (cond yuuji@68: ((looking-at "subsubsub") 3) yuuji@68: ((looking-at "subsub") 2) yuuji@68: ((looking-at "sub") 1) yuuji@68: (t 0))))) yuuji@51: (funcall indent-relative depth)) yuuji@82: (YaTeX-reindent (or (car (cdr (YaTeX-get-item-info t inenv))) yuuji@53: (+ (save-excursion yuuji@53: (beginning-of-line) yuuji@53: (YaTeX-current-indentation)) yuuji@52: YaTeX-environment-indent)))) yuuji@48: ) yuuji@49: ((YaTeX-literal-p) ;verbatims yuuji@48: (tab-to-tab-stop)) yuuji@82: ((string-match "\\(tabular\\|array\\)" inenv) ;1.73 yuuji@359: (let ((n 1) (cc (current-column)) (p (point))) yuuji@82: (condition-case err yuuji@82: (save-excursion yuuji@82: (beginning-of-line) yuuji@82: (skip-chars-forward "[ \t]") yuuji@82: ;;(if (looking-at "&") (forward-char 1)) yuuji@82: (require 'yatexenv) yuuji@82: (setq n (car (YaTeX-array-what-column-internal)))) yuuji@82: (error nil)) yuuji@82: (YaTeX-reindent yuuji@82: (+ (YaTeX-current-indentation) yuuji@82: YaTeX-environment-indent yuuji@359: (* (1- n) YaTeX-tabular-indentation))) yuuji@359: (and (= cc (current-column)) yuuji@359: (= p (point)) yuuji@359: (equal last-command 'YaTeX-indent-line) yuuji@359: ;; if NO indent action occured, move to the next column yuuji@359: (YaTeX-forward-field 1)))) yuuji@52: ((and inenv (not (equal "document" inenv))) yuuji@48: (funcall indent-relative)) yuuji@53: ((YaTeX-on-section-command-p YaTeX-sectioning-regexp) yuuji@53: (require 'yatexsec) ;to know YaTeX-sectioning-level yuuji@68: (setq sect (YaTeX-match-string 1)) yuuji@68: (if (string-match "\\*$" sect) yuuji@68: (setq sect (substring sect 0 -1))) yuuji@53: (YaTeX-reindent yuuji@53: (* (max yuuji@53: (1- ;I want chapter to have indentation 0 yuuji@68: (or (cdr (assoc sect YaTeX-sectioning-level)) yuuji@53: 0)) yuuji@53: 0) yuuji@53: YaTeX-environment-indent))) yuuji@53: ;;Default movement yuuji@48: ((and (bolp) fill-prefix) (insert fill-prefix)) yuuji@48: (t (save-excursion yuuji@48: (beginning-of-line) yuuji@64: (if fill-prefix yuuji@64: (progn yuuji@64: (delete-region (point) yuuji@64: (progn (skip-chars-forward " \t") yuuji@64: (point))) yuuji@64: (insert fill-prefix)) yuuji@64: (skip-chars-forward " \t") yuuji@82: (if (bobp) yuuji@82: nil yuuji@82: (indent-relative-maybe)))) yuuji@52: (skip-chars-forward " \t"))) yuuji@53: ;;if current line is \begin, re-indent \end too yuuji@53: (if (and (YaTeX-on-begin-end-p) (match-beginning 1)) yuuji@53: (save-excursion yuuji@53: ;;(beginning-of-line) yuuji@53: ;;(search-forward "\\begin") yuuji@53: (goto-char (match-beginning 0)) yuuji@53: (setq depth (current-column)) yuuji@53: (YaTeX-goto-corresponding-environment) yuuji@53: (YaTeX-reindent depth))) yuuji@59: (if (or yuuji@59: (and NTT-jTeX yuuji@59: (save-excursion (beginning-of-line) (looking-at "[ \t]"))) yuuji@59: (save-excursion yuuji@59: (beginning-of-line) yuuji@59: (and yuuji@82: (not (bobp)) yuuji@82: (progn yuuji@82: (backward-char 1) yuuji@82: (re-search-backward yuuji@82: "\\\\\\(\\(page\\)?ref\\|cite\\){" (point-beginning-of-line) t)) yuuji@59: (goto-char (1- (match-end 0))) yuuji@59: (> (save-excursion yuuji@59: (condition-case () yuuji@59: (progn (forward-list 1) (point)) yuuji@59: (error (point-max)))) yuuji@59: (point-end-of-line))))) yuuji@52: (save-excursion yuuji@52: (end-of-line) yuuji@52: (let ((p (point))) yuuji@52: (forward-line -1) yuuji@52: (end-of-line) yuuji@52: (or (= p (point)) yuuji@52: (looking-at (regexp-quote YaTeX-comment-prefix)) yuuji@52: (bobp) (bolp) yuuji@52: (save-excursion yuuji@52: (backward-word 1) yuuji@52: (looking-at "\\sw+")) ;is not japanese string yuuji@69: (insert YaTeX-comment-prefix))))))) yuuji@22: yuuji@77: (defun YaTeX-comment-line-break (&optional soft) yuuji@77: "Call comment-indent-new-line and YaTeX-indent-line" yuuji@77: (comment-indent-new-line soft) yuuji@77: (YaTeX-indent-line)) yuuji@77: yuuji@70: (defun YaTeX-latex2e-p () yuuji@70: (let ((b (current-buffer)) yuuji@70: (ptn (concat YaTeX-ec "documentclass"))) yuuji@70: (unwind-protect yuuji@70: (or (save-excursion (search-backward ptn nil t)) yuuji@70: (progn yuuji@70: (YaTeX-visit-main t) yuuji@70: (save-excursion (search-backward ptn nil t)))) yuuji@70: (set-buffer b)))) yuuji@70: yuuji@7: (provide 'yatex) yuuji@7: (defvar yatex-mode-load-hook nil yuuji@7: "*List of functions to be called when yatex.el is loaded.") yuuji@72: (if (and YaTeX-emacs-19 YaTeX-display-color-p (not (featurep 'yatex19))) yuuji@55: (load "yatex19")) yuuji@51: (load "yatexhks" t) yuuji@51: yuuji@51: ;;-------------------- Final hook jobs -------------------- yuuji@51: (substitute-all-key-definition yuuji@51: 'fill-paragraph 'YaTeX-fill-paragraph YaTeX-mode-map) yuuji@72: (substitute-all-key-definition yuuji@73: 'kill-buffer 'YaTeX-kill-buffer YaTeX-mode-map) yuuji@7: (run-hooks 'yatex-mode-load-hook) yuuji@51: yuuji@51: ;; `History' was moved to ChangeLog yuuji@0: ;----------------------------- End of yatex.el -----------------------------