Blame style/exam.el

Packit f2bd10
;;; exam.el --- AUCTeX style for the (LaTeX) exam class
Packit f2bd10
Packit f2bd10
;; Copyright (C) 2016, 2017 Free Software Foundation, Inc.
Packit f2bd10
Packit f2bd10
;; Author: Uwe Brauer <oub@mat.ucm.es>
Packit f2bd10
;; Created: 2016-03-06
Packit f2bd10
;; Keywords: tex
Packit f2bd10
Packit f2bd10
;; This file is part of AUCTeX.
Packit f2bd10
Packit f2bd10
;; AUCTeX is free software; you can redistribute it and/or modify it
Packit f2bd10
;; under the terms of the GNU General Public License as published by
Packit f2bd10
;; the Free Software Foundation; either version 3, or (at your option)
Packit f2bd10
;; any later version.
Packit f2bd10
Packit f2bd10
;; AUCTeX is distributed in the hope that it will be useful, but
Packit f2bd10
;; WITHOUT ANY WARRANTY; without even the implied warranty of
Packit f2bd10
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit f2bd10
;; General Public License for more details.
Packit f2bd10
Packit f2bd10
;; You should have received a copy of the GNU General Public License
Packit f2bd10
;; along with AUCTeX; see the file COPYING.  If not, write to the Free
Packit f2bd10
;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
Packit f2bd10
;; 02110-1301, USA.
Packit f2bd10
Packit f2bd10
;;; Commentary:
Packit f2bd10
Packit f2bd10
;; This file adds support for the exam class.
Packit f2bd10
Packit f2bd10
;; Acknowledgements
Packit f2bd10
;; Arash Esbati <arash@gnu.org> for a almost complete rewrite.
Packit f2bd10
Packit f2bd10
;;; Code:
Packit f2bd10
Packit f2bd10
(defvar LaTeX-exam-class-options
Packit f2bd10
  '("answers" "noanswers" "cancelspace" "nocancelspace" "addpoints")
Packit f2bd10
  "Class options for the exam class.")
Packit f2bd10
Packit f2bd10
(defun LaTeX-exam-insert-item ()
Packit f2bd10
  "Insert a new item in an environment from exam class.
Packit f2bd10
Item inserted depends on the environment."
Packit f2bd10
  (TeX-insert-macro
Packit f2bd10
   (cond ((string= environment "questions")
Packit f2bd10
          "question")
Packit f2bd10
         ((string= environment "parts")
Packit f2bd10
          "part")
Packit f2bd10
         ((string= environment "subparts")
Packit f2bd10
          "subpart")
Packit f2bd10
         ((string= environment "subsubparts")
Packit f2bd10
          "subsubpart")
Packit f2bd10
         ;; Fallback
Packit f2bd10
         (t "item"))))
Packit f2bd10
Packit f2bd10
(defun LaTeX-exam-insert-label (_optional &optional name type)
Packit f2bd10
  "Indent the line and query/insert a label incl. the \"\\label\" macro.
Packit f2bd10
Arguments NAME and TYPE are the same as for the function
Packit f2bd10
`LaTeX-label'.  OPTIONAL is ignored."
Packit f2bd10
  (indent-according-to-mode)
Packit f2bd10
  (let ((currenv (LaTeX-current-environment)))
Packit f2bd10
    (LaTeX-label (or name currenv) (or type 'environment))))
Packit f2bd10
Packit f2bd10
(TeX-add-style-hook
Packit f2bd10
 "exam"
Packit f2bd10
 (lambda ()
Packit f2bd10
   (TeX-run-style-hooks "article")
Packit f2bd10
   ;; Add options from `LaTeX-article-class-options' only once:
Packit f2bd10
   (dolist (opt LaTeX-article-class-options)
Packit f2bd10
     (add-to-list 'LaTeX-exam-class-options opt))
Packit f2bd10
   ;; Make our label prefix available ...
Packit f2bd10
   (let ((envs '("questions")))
Packit f2bd10
     (dolist (env envs)
Packit f2bd10
       ;; to AUCTeX
Packit f2bd10
       (add-to-list 'LaTeX-label-alist
Packit f2bd10
                    (cons env 'LaTeX-exam-label))
Packit f2bd10
       ;; to RefTeX with `reftex-add-label-environments'
Packit f2bd10
       (when (fboundp 'reftex-add-label-environments)
Packit f2bd10
         (reftex-add-label-environments
Packit f2bd10
          `((,env ,LaTeX-exam-reftex-quick-id-key ,LaTeX-exam-label
Packit f2bd10
                  "~\\ref{%s}" nil
Packit f2bd10
                  (regexp "[Qq]uestions?" "[Nn]umbers?")))))))
Packit f2bd10
   (when (or (member "xcolor" (TeX-style-list))
Packit f2bd10
             (member "color" (TeX-style-list)))
Packit f2bd10
     (TeX-add-symbols '("shadedsolutions" 0)))
Packit f2bd10
Packit f2bd10
   (LaTeX-add-environments
Packit f2bd10
    '("solution" [ "Height" ])
Packit f2bd10
    '("select")
Packit f2bd10
    '("solutionorbox" [ "Height" ])
Packit f2bd10
    '("solutionorlines" [ "Height" ])
Packit f2bd10
    '("solutionordottedlines" [ "Height" ])
Packit f2bd10
    '("solutionorgrid" [ "Height" ])
Packit f2bd10
    '("questions" LaTeX-env-item)
Packit f2bd10
    '("parts" LaTeX-env-item)
Packit f2bd10
    '("subparts" LaTeX-env-item)
Packit f2bd10
    '("subsubparts" LaTeX-env-item))
Packit f2bd10
Packit f2bd10
   ;; Tell AUCTeX about special environments:
Packit f2bd10
   (let ((envs '("questions" "parts" "subparts" "subsubparts")))
Packit f2bd10
     (dolist (env envs)
Packit f2bd10
       (add-to-list 'LaTeX-item-list
Packit f2bd10
                    (cons env 'LaTeX-exam-insert-item))))
Packit f2bd10
Packit f2bd10
   ;; Append us only once:
Packit f2bd10
   (unless (and (string-match "question" LaTeX-item-regexp)
Packit f2bd10
                (string-match "subsub" LaTeX-item-regexp))
Packit f2bd10
     (set (make-local-variable 'LaTeX-item-regexp)
Packit f2bd10
          (concat
Packit f2bd10
           LaTeX-item-regexp
Packit f2bd10
           "\\|"
Packit f2bd10
           "\\(titled\\)?question\\b"
Packit f2bd10
           "\\|"
Packit f2bd10
           "\\(sub\\|subsub\\)?part\\b"))
Packit f2bd10
     (LaTeX-set-paragraph-start))
Packit f2bd10
Packit f2bd10
   (TeX-add-symbols
Packit f2bd10
    '("part" [ "Points" ] (TeX-arg-literal " "))
Packit f2bd10
    '("subpart" [ "Points" ] (TeX-arg-literal " "))
Packit f2bd10
    '("gradetable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("bonusgradetable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("bonuspointtable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("partialgradetable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("partialbonusgradetable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("partialbonuspointtable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("pointtable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
    '("partialpointtable"
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Orientation")
Packit f2bd10
                     '("v" "h") ]
Packit f2bd10
      [ TeX-arg-eval completing-read
Packit f2bd10
                     (TeX-argument-prompt optional nil "Table index")
Packit f2bd10
                     '("questions" "pages") ] )
Packit f2bd10
Packit f2bd10
    '("subsubpart" [ "Points" ] (TeX-arg-literal " "))
Packit f2bd10
    '("question"  ["Points"] (TeX-arg-literal " "))
Packit f2bd10
    '("bonusquestion"  ["Points"] (TeX-arg-literal " "))
Packit f2bd10
    '("extrafootheight"  [ TeX-arg-length "Extra height 1. page footer" ]
Packit f2bd10
      (TeX-arg-length "Extra height footers"))
Packit f2bd10
    '("titledquestion" "Title" ["Points"] LaTeX-exam-insert-label (TeX-arg-literal " "))
Packit f2bd10
    '("ContinuedQuestion" 0)
Packit f2bd10
    '("CorrectChoice" 0)
Packit f2bd10
    '("CorrectChoiceEmphasis" 1)
Packit f2bd10
    '("IncompleteQuestion" 0)
Packit f2bd10
    '("SolutionEmphasis" 1)
Packit f2bd10
    '("addpoints" 0)
Packit f2bd10
    '("addquestionobject" 0)
Packit f2bd10
    '("answerclearance" 1)
Packit f2bd10
    '("answerline"  ["Points"] (TeX-arg-literal " "))
Packit f2bd10
    '("begingradingrange" 1)
Packit f2bd10
    '("bhpgword" 1)
Packit f2bd10
    '("bhpword" 1)
Packit f2bd10
    '("bhqword" 1)
Packit f2bd10
    '("bhsword" 1)
Packit f2bd10
    '("bhtword" 1)
Packit f2bd10
    '("bonuspart" 0)
Packit f2bd10
    '("bonuspointformat" 0)
Packit f2bd10
    '("bonuspointname" 1)
Packit f2bd10
    '("bonuspointpoints" 2)
Packit f2bd10
    '("bonuspointsinrange" 0)
Packit f2bd10
    '("bonuspointsofquestion" 1)
Packit f2bd10
    '("bonuspointsonpage" 0)
Packit f2bd10
    '("bonusqformat" 1)
Packit f2bd10
    '("bonussubpart" 0)
Packit f2bd10
    '("bonussubsubpart" 0)
Packit f2bd10
    '("bonustitledquestion" "Title" ["Points"] LaTeX-exam-insert-label (TeX-arg-literal " "))
Packit f2bd10
    '("bonustotalformat" 0)
Packit f2bd10
    '("boxedpoints" 0)
Packit f2bd10
    '("bracketedpoints" 0)
Packit f2bd10
    '("bvpgword" 1)
Packit f2bd10
    '("bvpword" 1)
Packit f2bd10
    '("bvqword" 1)
Packit f2bd10
    '("bvsword" 1)
Packit f2bd10
    '("bvtword" 1)
Packit f2bd10
    '("cancelspace" 0)
Packit f2bd10
    '("cellwidth" 1)
Packit f2bd10
    '("cfoot" 1)
Packit f2bd10
    '("chbpword" 1)
Packit f2bd10
    '("chead" 1)
Packit f2bd10
    '("checkboxchar" 1)
Packit f2bd10
    '("checkboxeshook" 0)
Packit f2bd10
    '("checkedchar" 1)
Packit f2bd10
    '("choice" 0)
Packit f2bd10
    '("choicelabel" 0)
Packit f2bd10
    '("choiceshook" 0)
Packit f2bd10
    '("chpgword" 1)
Packit f2bd10
    '("chpword" 1)
Packit f2bd10
    '("chqword" 1)
Packit f2bd10
    '("chsword" 1)
Packit f2bd10
    '("chsword" 1)
Packit f2bd10
    '("correctchoice" 0)
Packit f2bd10
    '("correctchoiceemphasis" 1)
Packit f2bd10
    '("covercfoot" 3)
Packit f2bd10
    '("coverchead" 3)
Packit f2bd10
    '("coverextrafootheight" 3)
Packit f2bd10
    '("coverextraheadheight" 3)
Packit f2bd10
    '("coverfirstpagefooter" 3)
Packit f2bd10
    '("coverfirstpageheader" 3)
Packit f2bd10
    '("coverfooter" 3)
Packit f2bd10
    '("coverheader" 3)
Packit f2bd10
    '("coverlfoot" 3)
Packit f2bd10
    '("coverlhead" 3)
Packit f2bd10
    '("coverrfoot" 3)
Packit f2bd10
    '("coverrhead" 3)
Packit f2bd10
    '("coverrunningfooter" 3)
Packit f2bd10
    '("coverrunningheader" 3)
Packit f2bd10
    '("cvbpword" 1)
Packit f2bd10
    '("cvpgword" 1)
Packit f2bd10
    '("cvpword" 1)
Packit f2bd10
    '("cvqword" 1)
Packit f2bd10
    '("cvsword" 1)
Packit f2bd10
    '("cvtword" 1)
Packit f2bd10
    '("dottedlinefillheight" 1)
Packit f2bd10
    '("droppoints" 0)
Packit f2bd10
    '("droptotalbonuspoints" 0)
Packit f2bd10
    '("droptotalpoints" 0)
Packit f2bd10
    '("endgradingrange" 1)
Packit f2bd10
    '("extraheadheight" 1)
Packit f2bd10
    '("extrawidth" 1)
Packit f2bd10
    '("fillwithdottedlines" 1)
Packit f2bd10
    '("fillwithlines" 1)
Packit f2bd10
    '("firstpagefooter" 1)
Packit f2bd10
    '("firstpagefootrule" 0)
Packit f2bd10
    '("firstpageheader" 3)
Packit f2bd10
    '("firstpageheadrule" 0)
Packit f2bd10
    '("footer" 3)
Packit f2bd10
    '("footrule" 0)
Packit f2bd10
    '("framedsolutions" 0)
Packit f2bd10
    '("fullwidth" 1)
Packit f2bd10
    '("gradetablestretch" 0)
Packit f2bd10
    '("greeknum" 0)
Packit f2bd10
    '("half" 0)
Packit f2bd10
    '("hpgword" 1)
Packit f2bd10
    '("hpword" 1)
Packit f2bd10
    '("hqword" 1)
Packit f2bd10
    '("hsword" 1)
Packit f2bd10
    '("htword" 1)
Packit f2bd10
    '("ifcontinuation" 0)
Packit f2bd10
    '("ifincomplete" 0)
Packit f2bd10
    '("iflastpage" 0)
Packit f2bd10
    '("ifprintanswers" 0)
Packit f2bd10
    '("lfoot" 1)
Packit f2bd10
    '("lhead" 1)
Packit f2bd10
    '("linefillheight" 1)
Packit f2bd10
    '("linefillthickness" 1)
Packit f2bd10
    '("makeemptybox" 1)
Packit f2bd10
    '("marginbonuspointname" 1)
Packit f2bd10
    '("marginpointname" 1)
Packit f2bd10
    '("marginpointsep" 1)
Packit f2bd10
    '("marksnotpoints" 0)
Packit f2bd10
    '("noaddpoints" 0)
Packit f2bd10
    '("nobonusqformat" 1)
Packit f2bd10
    '("noboxedpoints" 0)
Packit f2bd10
    '("nobracketedpoints" 0)
Packit f2bd10
    '("nocancelspace" 0)
Packit f2bd10
    '("nomorequestions" 0)
Packit f2bd10
    '("nopointsinmargin" 0)
Packit f2bd10
    '("nopointsinrightmargin" 0)
Packit f2bd10
    '("noprintanswers" 0)
Packit f2bd10
    '("noqformat" 1)
Packit f2bd10
    '("numbonuspoints" 0)
Packit f2bd10
    '("numcoverpages" 0)
Packit f2bd10
    '("numpages" 0)
Packit f2bd10
    '("numparts" 0)
Packit f2bd10
    '("numpoints" 0)
Packit f2bd10
    '("numquestions" 0)
Packit f2bd10
    '("numsubparts" 0)
Packit f2bd10
    '("numsubsubparts" 0)
Packit f2bd10
    '("oddeven" 2)
Packit f2bd10
    '("partlabel" 0)
Packit f2bd10
    '("partopsep" 0)
Packit f2bd10
    '("partshook" 0)
Packit f2bd10
    '("pointname" 1)
Packit f2bd10
    '("pointpoints" 2)
Packit f2bd10
    '("pointsdroppedatright" 0)
Packit f2bd10
    '("pointsinmargin" 0)
Packit f2bd10
    '("pointsinrightmargin" 0)
Packit f2bd10
    '("pointsofquestion" 1)
Packit f2bd10
    '("pointsonpage" 1)
Packit f2bd10
    '("printanswers" 0)
Packit f2bd10
    '("printselectedfalse" 0)
Packit f2bd10
    '("printselectedtrue" 0)
Packit f2bd10
    '("qformat" 1)
Packit f2bd10
    '("questionlabel" 0)
Packit f2bd10
    '("questionshook" 0)
Packit f2bd10
    '("rfoot" 1)
Packit f2bd10
    '("rhead" 1)
Packit f2bd10
    '("rightpointsmargin" 0)
Packit f2bd10
    '("roman" 0)
Packit f2bd10
    '("romannumeral" 0)
Packit f2bd10
    '("runningfooter" 3)
Packit f2bd10
    '("runningfootrule" 0)
Packit f2bd10
    '("runningheader" 3)
Packit f2bd10
    '("runningheadrule" 0)
Packit f2bd10
    '("settabletotalbonuspoints" 1)
Packit f2bd10
    '("settabletotalpoints" 1)
Packit f2bd10
    '("shadedsolutions" 0)
Packit f2bd10
    '("solutiontitle" 0)
Packit f2bd10
    '("subpartlabel" 0)
Packit f2bd10
    '("subpartshook" 0)
Packit f2bd10
    '("subsubpartlabel" 0)
Packit f2bd10
    '("subsubpartshook" 0)
Packit f2bd10
    '("thechoice" 0)
Packit f2bd10
    '("themarginpoints" 0)
Packit f2bd10
    '("thepartno" 0)
Packit f2bd10
    '("thequestion" 0)
Packit f2bd10
    '("thequestiontitle" 0)
Packit f2bd10
    '("thesubpart" 0)
Packit f2bd10
    '("thesubsubpart" 0)
Packit f2bd10
    '("totalbonuspoints" 0)
Packit f2bd10
    '("totalformat" 0)
Packit f2bd10
    '("totalnumpages" 0)
Packit f2bd10
    '("totalpoints" 0)
Packit f2bd10
    '("unframedsolutions" 0)
Packit f2bd10
    '("uplevel" 1)
Packit f2bd10
    '("usehorizontalhalf" 0)
Packit f2bd10
    '("useslantedhalf" 0)
Packit f2bd10
    '("vpgword" 1)
Packit f2bd10
    '("vpword" 1)
Packit f2bd10
    '("vqword" 1)
Packit f2bd10
    '("vsword" 1)
Packit f2bd10
    '("vtword" 1)
Packit f2bd10
    '("thepoints" 0)
Packit f2bd10
    ;; ... more stuff here
Packit f2bd10
    )
Packit f2bd10
   (LaTeX-add-lengths "answerlinelength" "answerskip")
Packit f2bd10
Packit f2bd10
   ;; Fontification
Packit f2bd10
   (when (and (featurep 'font-latex)
Packit f2bd10
              (eq TeX-install-font-lock 'font-latex-setup))
Packit f2bd10
     (font-latex-add-keywords '(("question"        "[")
Packit f2bd10
                                ("titledquestion"  "{[")
Packit f2bd10
                                ("subpart"         "[")
Packit f2bd10
                                ("subsubpart"      "["))
Packit f2bd10
                              'textual)))
Packit f2bd10
 LaTeX-dialect)
Packit f2bd10
Packit f2bd10
;;; exam.el ends here