summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/jeopardy/jeopardy.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/jeopardy/jeopardy.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/jeopardy/jeopardy.dtx')
-rw-r--r--macros/latex/contrib/jeopardy/jeopardy.dtx1009
1 files changed, 1009 insertions, 0 deletions
diff --git a/macros/latex/contrib/jeopardy/jeopardy.dtx b/macros/latex/contrib/jeopardy/jeopardy.dtx
new file mode 100644
index 0000000000..a2101cce5d
--- /dev/null
+++ b/macros/latex/contrib/jeopardy/jeopardy.dtx
@@ -0,0 +1,1009 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2004 by Robert Marik <marik@mendelu.cz>
+% -------------------------------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.2
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.2 or later is part of all distributions of LaTeX
+% version 1999/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{jeopardy.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{jeopardy}
+%<*package>\ProvidesPackage{jeopardy}
+[2010/04/07 v1.1a .dtx jeopardy file]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{jeopardy.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v1.0}{2006/10/28}{Initial version}
+% \changes{v1.01}{2006/10/30}{Minor changes to get compatibility with
+% the last exerquiz.sty}
+% \changes{v1.02}{2006/11/2}{Option picture
+% added. Changed macro "title" into "JeopardyTitle".}
+% \changes{v1.02a}{2006/11/3}{Minor update: Option bgpicture
+% added.}
+% \changes{v1.1}{2007/03/12}{Option twoplayers.}
+% \changes{v1.1a}{2010/04/07}{Examples redesigned to work in TeXlive 2009.}
+%
+% \GetFileInfo{jeopardy.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\vbox,\hbox, \', \@@end,
+% \@@RespBoxMathActions, \@@RespBoxTxtActions, \@Panelhomepagename,
+% \@Panelfullscreenname, \@jeopardyFineTunefalse, \@Panelclosename,
+% \@Panelquitname, }
+%
+%
+% \title{The \textsf{jeopardy} package\thanks{This document
+% corresponds to \textsf{jeopardy}~\fileversion, dated
+% \filedate.}} \author{Robert Ma\v r\'\i k \\
+% \texttt{marik@mendelu.cz}\thanks{Supported by the grant 18/2006 of
+% the Fund for Developement of Czech Universities.}}
+%
+% \maketitle
+%
+% \section{Introduction}
+%
+% Jeopardy like game -- redesigned the \verb|jj_game.cls| by D. P.
+% Story. The package requires to load \verb|exerquiz| and
+% \verb|dljslib| packages from AcroTeX bundle. The current only
+% supported way to produce pdf file is \verb|pdftex|. The main
+% properties include
+% \begin{itemize}
+% \item In contrast to \verb|jj_game.cls|, the \verb|oQuestion|
+% environment is used to allow fill-in questions.
+% \item The \verb|proofing| option is introduced. Use this option to
+% typeset your answers into the document. To check the answers for
+% \verb|\RespBoxMath| and |\RespBoxTxt| commands remember to use
+% transparent background for these text fields or use the browser
+% which does not show these fields, like \verb|xpdf|.
+% \item Option |twoplayers| builds game for two players.
+% \item Option |bgpicture| is used to place the picture below the
+% buttons (|graphicx| package is used). The name of the picture is
+% stored in the |\JeopardyPictureFile| command. Default value is
+% |picture.jpg|. You can change it by using command like
+% |\def\JeopardyPictureFile{blabla.jpg}|. If you use this option,
+% you may also consider the (rather tricky) option |finetune|. This
+% option is described with the corresponding code at the end of this
+% file. The |bgpicture| option is automaticaly turned on when
+% |picture| option is active.
+% \item The option |picture| is introduced for another version of the
+% game. The user gets no score but uncovers parts of a picture
+% hidden by buttons and (after wrong answer) non-transparent fields.
+% It can be used in the class and students can guess what is on the
+% picture. The option adds the "Solution" button below the
+% gameboard. If the user clicks this button, all buttons from not
+% yet answered questions and fields from wrong answered questions
+% are hidden and the picture is fully visible. After the second
+% click on this button, a |\ChampionMsg| is shown. This can be used
+% for example to store the name of a person on the picture.
+% \item The user is not allowed to browse pages of the game without
+% clicking in gameboard. We use the (not portable)
+% \verb|\pdfpageattr| command to achieve this behavior. This can be
+% turned off by \verb|allowpeeking| option.
+% \item The \verb|evalonblur| option may be used. This concerns
+% filling forms for |\RespBoxTxt| and |\RespBoxMath| questions and
+% the following problem with switching keyboard layout: When filling
+% the text field, if user switches the keyboard
+% layout\footnote{necessary, for example, to write powers on Czech
+% keyboard} using keyboard shortcut on Linux, the (not yet
+% finished and hence incorrect) answer is evaluated and marked as
+% wrong. Known workarounds:
+% \begin{itemize}
+% \item The user should erase the contents of the field completely,
+% switch the keyboard, click into the field and type his/her
+% answer.
+% \item The user should change keyboard using mouse and Gnome applet.
+% \item The author can compile the file with \verb|evalonblur|
+% option. The answer is evaluated after \verb|shift+click|-ing
+% outside the field.
+% \end{itemize}
+% \end{itemize}
+% This package has been tested on Texlive2005+Linux (pdfeTeXk, Version
+% 3.141592-1.30.4-2.2 (Web2C 7.5.5)), with \verb|exerquiz| 2006/18/06
+% v6.05e.
+%
+% \section{Usage}
+%
+% To instal the style run |latex jeopardy.ins| from the directory with
+% |jeopardy.dtx|. You get files |jeopardy.sty| and |jeopardy.cfg|.
+% Copy both files where \LaTeX{} finds them and include your
+% customizations into |jeopardy.cfg|.
+%
+% For sample file look at the files \verb|game*.tex|. The number of
+% questions and categories is written into \verb|aux| file and stored
+% in macros \verb|\NumberOfQuestions| and \verb|\NumberOfCategories|.
+% From this reason, the file has to be two times \verb|pdflatex|-ed to
+% build the game. The |aux| file contains also definitions for the
+% category names. These names are not used when |picture| option is
+% active.
+%
+% \DescribeMacro{\MakeGameBoard} Macro |\MakeGameBoard| typesets the
+% game board. This should be at the begin of the file and followed by
+% \verb|category| environments. The dimensions of cells are
+% \verb|\CellWidth| and \verb|\CellHeight|. The user can set these
+% dimensions after \verb|\begin{document}| or with the |\SetGameWidth|
+% and |\SetGameHeight| commands. Write e.g. |\SetGameHeight{10cm}|.
+% The fields are created via \verb|\pushButton| and
+% \verb|\textField| commands and the user may change the default
+% behavior using command available in the package \verb|eforms.sty|.
+% The colors for wrong and right messages are set in \verb|exerquiz|
+% package and stored in \verb|\correctColor| and \verb|\wrongColor|
+% macros. The tokens registers |\GrandPoohbahtoks|, |\Celltoks| and
+% |\Scoretoks| are used to build the GrandPoohbah field (see below),
+% cell fields and score field. You can set it by e.g.
+% |\GrandPoohbahtoks{\Q{0}\textColor{1 0 0 rg}}|. All these
+% registers are empty by default. The exception is if the |picture|
+% option is used, the |\Celltoks| is set to |\BG{0 0 0}|. If you
+% change it, remember to use non-transparent background for cells!
+%
+% \DescribeMacro{\AfterGameBoard} Macro |\AfterGameBoard| is
+% execuetd between gameboard and score field.
+%
+% \DescribeMacro{\everyCategoryHead} Tokens register
+% |\everyCategoryHead| is used at the begin of every category head.
+% You can set it by something like
+% |\everyCategoryHead{\textrm\footnotesize}|
+%
+% \DescribeMacro{\JeopardyTitle} The |\JeopardyTitle| macro contains
+% the title of the game. The title is the hyperlink anchor used to
+% return from questions to the gameboard. You can set it by e.g.
+% |\def\JeopardyTitle{The title of the game}|.
+%
+% \DescribeEnv{category} The |category| environment has one
+% parameter -- the name of the category. It encloses \verb|question|
+% environments. The category name is not used if the |picture|
+% option is active. In this case the name is replaced by the capital
+% letter A, B, C, \dots. In this case you (or your students) can
+% refer to the fields like on chessboard.
+%
+% \DescribeEnv{question} The |question| environment contains a
+% question and answers for multiple choice questions. The answers are
+% introduced by \verb|\Ans0| (wrong answers) or \verb|\Ans1| (correct
+% answers). The environment includes an \verb|oQuestion| environment
+% and hence it may contain \verb|\RespBoxMath| or |\RespBoxTxt|
+% command.
+%
+% \DescribeMacro{\Goal} If the user finishes the game with at least
+% \verb|\Goal| points, a hidden banner (GrandPoohbah field) with
+% message stored in \verb|\ChampionMsg| command is shown. The default
+% initial value
+% \verb|45*(1+numQuestions)*numQuestions*numCategories*\JeopardyScaleFactor|
+% means 90 percent of the maximal point score. The banner has height
+% \verb|\GrandPoohbahHeight|. This macro is not used if the option
+% |picture| is active. In this case the |\ChampionMsg| should contain
+% the name of the picture (for example the name of the person on
+% photograph) and it can be shown by doubleclicking "Solution"
+% button at the bottom.
+%
+% \DescribeMacro{\SetGameWidth} Macro |\SetGameWidth| sets the
+% |\GameWidth| register with the width of the game desk. It evaluates
+% the width of cells as quotient of the parameter of the macro and the
+% number of categories. Macro |\SetGameHeight| works in a similar way
+% if the option |picture| is not active. If the option |picture| is
+% active, the height of the game is evaluated from the dimensions of
+% the picture. The width of the picture is scaled into |\GameWidth| and
+% the height is established from the height of the scaled picture.
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% Check that we use |pdflatex| and both \verb|exerquiz| and
+% \verb|dljslib| packages are loaded.
+% \begin{macrocode}
+%<*package>
+
+\ifx\shortquiz\undefined
+\PackageWarning{Jeopardy}{!!!!!!!!!!!!! Load exerquiz package !!!!!!!!!!!}
+\def\finito{\@@end}
+\expandafter\finito\fi
+
+\ifx\dljsRegister\undefined
+\PackageWarning{Jeopardy}{!!!!!!!!!!!!! Load dljslib package !!!!!!!!!!!}
+\def\finito{\@@end}
+\expandafter\finito\fi
+
+\if\eq@drivernum1%%% pdftex
+ \typeout{*** using pdftex option ***}
+ \def\JeopardyNoPeekCommand{
+ \edef\ThisPage{/AA<</O<</S/JavaScript/JS(kontrola(
+ \the\QuestCount,\the\CatCount);)>> >>}
+ \global\pdfpageattr=\expandafter{\ThisPage}%
+ }
+\else
+ \def\JeopardyNoPeekCommand{}
+ \typeout{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
+ \typeout{!!!!!!!! The package has been tested with pdflatex only.}
+ \typeout{!!!!!!!! Use pdflatex drivers in eforms.sty and exerquiz.sty.}
+ \typeout{!!!!!!!! On your own risk you can use other drivers
+ with *allowpeeking* option.}
+ \PackageWarning{Jeopardy}{No pdftex drivers for eforms and exerquiz}
+\fi
+
+\RequirePackage{multido}
+
+\DeclareOption{czech}{
+\def\formessage{za}
+\def\Scoremessage{Body}
+\def\fairmsg{Nesidit! Odpovidate na jinou otazku!}
+\def\who@answers@msg#1{Odpovida hrac #1}
+\def\RightWrongMessages{
+aCM = new Array\
+( "Spravne! Jen tak dal!",
+ "Vyborne! Gratuluji!",
+ "Dobre! Pokracujte ve spravne nacate praci!",
+ "Ano, ano, ano, ano!",
+ "Spravne! Zkuste i tezsi otazky",
+ "Spravna odpoved!",
+ "Presne tak! Ziskavate dalsi body"
+);
+aEM = new Array\
+( "To neni spravne! Zkuste jinou otazku.",
+ "Chyba. Nehadejte!",
+ "Prosim! Prosim! Premyslejte nez odpovite!",
+ "Dalsi chyba! Hadanim se daleko nedostanete!",
+ "Ale ne! Kdepak! Body dolu.",
+ "Ne, zkuste jinou otazku.",
+ "Zase spatne! Bohuzel, vase konto se opet snizuje!"
+);}
+\def\NotAllowedMesssage{"Nesmite menit odpovedi!"}
+\def\RightMessage{Spravne}
+\def\WrongMessage{Spatne}
+\def\JeopardyTitle{Tituln\'\i{} strana}
+\def\ChampionMsg{Bravo! Mistr nad mistry!}
+}
+
+\def\formessage{for}
+\def\Scoremessage{Score}
+\def\NotAllowedMesssage{"Changing your answer is not allowed!"}
+\def\RightMessage{Right}
+\def\WrongMessage{Wrong}
+\def\fairmsg{Play Fair! Answer the question you have clicked!}
+\def\who@answers@msg#1{Player #1}
+\def\RightWrongMessages{
+aCM = new Array
+( "That's Right! Way to go, Kiddo!",
+ "Wonderfully Done! Congrats!",
+ "Very Good! Keep up the good work!",
+ "Good, good, good, good!",
+ "Gee, you're smart! Try a harder one!",
+ "You're pretty sharp! Continuez, s'il vous pla\string\356t!",
+ "You're the tops! But wait...try another."
+);
+aEM = new Array
+( "That's wrong! Sorry. Try Again.",
+ "Error again. Don't guess, I'm watching!",
+ "Please! Please! Work it out first!",
+ "An error has insinuated itself into your calculations. Recalibrate your thinking!",
+ "Bah! Humbug! You're haunted by Errors!",
+ "Try again. This time with order and method.",
+ "Wrong again! Use your little gray cells!"
+);
+}
+\def\JeopardyTitle{Jeopardy Game}
+\def\ChampionMsg{You are a Champion!}
+
+\newif\ifJeopardyNoPeeking
+\JeopardyNoPeekingtrue
+\DeclareOption{allowpeeking}{\JeopardyNoPeekingfalse}
+
+\newif\ifEvalOnBlur
+\EvalOnBlurfalse
+\DeclareOption{evalonblur}{\EvalOnBlurtrue}
+
+\newif\ifdouble \doublefalse
+\def\JeopardyScaleFactor{1}
+\DeclareOption{double}{\doubletrue\def\JeopardyScaleFactor{2}}
+
+\newif\ifoneplayer \oneplayertrue
+\DeclareOption{twoplayers}{\oneplayerfalse}
+
+\newif\if@jeopardyFineTune \@jeopardyFineTunefalse
+\DeclareOption{finetune}{\@jeopardyFineTunetrue}
+
+\DeclareOption{proofing}{\eq@proofingtrue \JeopardyNoPeekingfalse}
+\definecolor{webgreen}{rgb}{0,.5,0}
+
+\newif\if@jeopardyBgPicture
+\@jeopardyBgPicturefalse
+\DeclareOption{bgpicture}{\@jeopardyBgPicturetrue \everyPushButton{\BC{}}}
+
+\newif\if@jeopardyPicture
+\@jeopardyPicturefalse
+\def\Picture{0}
+\DeclareOption{picture}{\def\Picture{1}\def\formessage#1.{}%
+ \@jeopardyPicturetrue
+ \@jeopardyBgPicturetrue
+ \Celltoks{\BG{0 0 0}}
+ \everyPushButton{\BC{}}
+}
+
+
+\newtoks\GrandPoohbahtoks
+\newtoks\Scoretoks
+\newtoks\Celltoks
+\newtoks\Radiotoks
+\newtoks\Playertoks
+
+
+\ProcessOptions
+% \end{macrocode}
+% We load |graphicx| package for inserting bitmaps.
+% \begin{macrocode}
+\if@jeopardyBgPicture
+\RequirePackage{graphicx}
+\fi
+
+\sqTurnOffAlerts
+
+\newcount \CatCount
+\newcount \QuestCount
+\newcount \NumberOfCategories
+\newcount \NumberOfQuestions
+\newcount \QuestCountA \QuestCountA=-1
+\newcount \AnswerCount
+\newcount \OQuestionCount
+\newcount \temporarycount
+\newcounter{tempcounter}
+\everyRespBoxMath{\BG{1 1 1}}
+\everyRespBoxTxt{\BG{1 1 1}}
+
+\newlength \GrandPoohbahHeight
+\GrandPoohbahHeight = 10pt
+
+% \end{macrocode}
+% Macros for setting game width and height.
+% \begin{macrocode}
+\newlength\GameWidth
+\newlength\GameHeight
+\newlength\CellWidth
+\newlength\CellHeight
+\newlength\ScoreCellHeight
+\def\SetGameWidth#1{\GameWidth=#1\relax
+ \CellWidth=\GameWidth
+ \ifnum\NumberOfCategories=0
+ \divide\CellWidth by 10
+ \else
+ \divide\CellWidth by \NumberOfCategories
+ \fi
+}
+\def\SetGameHeight#1{\GameHeight=#1\relax
+ \CellHeight=\GameHeight
+ \ifnum\NumberOfCategories=0
+ \divide\CellHeight by 10
+ \else
+ \divide\CellHeight by \NumberOfQuestions
+ \fi
+ \ScoreCellHeight=\CellHeight
+}
+% \end{macrocode}
+% We do some basic initializations for dimensions of gameboard.
+% \begin{macrocode}
+\AtBeginDocument{
+\SetGameWidth{0.8\linewidth}
+\SetGameHeight{0.6\textheight}
+}
+% \end{macrocode}
+% Macros to typeset the picture. The default name of the picture is
+% |picture.jpg|. You can redefine the command |\insertJeopardyPicture|
+% to replace the picture e.g. by a text written in \TeX. To do this,
+% replace the |\includegraphics| command by something else, e.g.
+% |minipage| environment.
+% \begin{macrocode}
+\newbox\JeopardyPictureBox
+\def\JeopardyPictureFile{picture.jpg}
+\def\insertJeopardyPicture{%
+ \setbox\JeopardyPictureBox=%
+ \hbox{\includegraphics[width=\GameWidth]{\JeopardyPictureFile}}%
+ \SetGameHeight{1.02\ht\JeopardyPictureBox}%
+ \dimen0=\CellHeight
+ \dimen1=0.5\dimen0
+ \hbox to 0 pt{\vbox to 0 pt{\kern -\dimen1\box\JeopardyPictureBox\vss}\hss}%
+}
+
+% \end{macrocode}
+% We define |category| and |question| environments. We read the names of the
+% categories from the |aux| file and store these names in macros. These
+% names are not used when |picture| option is active. In this case we
+% convert the number of category into capital letter.
+% \begin{macrocode}
+\if@jeopardyPicture
+ \def\CategoryNameDef#1#2{%
+ \setcounter{tempcounter}{#1}%
+ \expandafter\xdef\csname CategoryName#1\endcsname{%
+ \Alph{tempcounter}\strut}}%
+\else
+ \def\CategoryNameDef#1#2{%
+ \expandafter\gdef\csname CategoryName#1\endcsname{#2}}%
+\fi
+
+% \end{macrocode}
+% The category environment simply increases the counter, writes the
+% name into |aux| file and checks the number of questions in the last
+% category environment.
+% \begin{macrocode}
+\newenvironment{category}[1]{%
+ \global\advance \CatCount by 1
+ \global\QuestCount=0
+ \immediate\write\@auxout{\string\CategoryNameDef{\the\CatCount}{#1}}%
+ }
+ {%
+ \ifnum \QuestCountA=-1 \global\QuestCountA=\QuestCount
+ \else
+ \ifnum\QuestCountA=\QuestCount
+ \else
+ \PackageWarning{Jeopardy}
+ {Bad number of questions in Category \the\CatCount.}
+ \fi
+ \fi
+ }
+% \end{macrocode}
+% |question| environment increases the counter, places the action to
+% check that the page is opened from the gameboard, writes the title
+% of the question and defines macro |\Ans| which typesets buttons with
+% correct and incorrect answers. It also starts the |oQuestion|
+% environment and hence the commands |\RespBoxMath| and |\RespBoxTxt|
+% from |exerquiz.sty| can be used. At the end of the environment we
+% close the |oQuestion| environment and start new page.
+% \begin{macrocode}
+\newenvironment{question}{%
+ \global\advance \QuestCount by 1\relax
+ \AnswerCount=0
+ \ifJeopardyNoPeeking
+ \JeopardyNoPeekCommand
+ \fi
+ \begin{center}%
+ \hypertarget{\the\QuestCount\the\CatCount}%
+ {\csname CategoryName\the\CatCount\endcsname{} %
+ \formessage{} \the\QuestCount00.}%
+ \end{center}%
+\def\Ans##1{\par
+\ifnum\AnswerCount=0 \vskip\medskipamount\fi
+\advance\AnswerCount by 1%
+\setcounter{tempcounter}{\the\AnswerCount}%
+\leavevmode\hbox to 0 pt{%
+\hss
+\ifeq@proofing \def\temp{##1}\if\temp1$\color{webgreen}\bullet$ \fi\fi
+\pushButton[\CA{\alph{tempcounter}}%
+ \A{\JS{useranswer(##1,\the\QuestCount,\the\CatCount);}}]%
+ {{Answer\the\AnswerCount-\the\QuestCount-\the\CatCount}}%
+ {1.3em}{1.3em}%
+\hskip1em}%
+\leftskip2em}%
+\begin{oQuestion}{Q\the\QuestCount\the\CatCount}%
+}{\par\end{oQuestion}\newpage}
+
+% \end{macrocode}
+% At the end of document we write the number of questions and
+% categories into |aux| file.
+% \begin{macrocode}
+\AtEndDocument{
+\immediate\write\@auxout{\string\global\string\NumberOfCategories=\the\CatCount}
+\immediate\write\@auxout{\string\global\string\NumberOfQuestions=\the\QuestCount}
+}
+% \end{macrocode}
+% Here we redefine some internal macros of |exerquiz.sty|.
+% \begin{macrocode}
+\ifEvalOnBlur
+\def\@@RespBoxMathActions
+{%
+ \AA{
+ \AAFormat{\eqFormatArg}%
+ \AAOnFocus{\JS{var retn = null;}}%
+ \AAOnBlur{\JS{retn = \processJSfunc(\rbArgs,\compareJSfunc);
+ if (event.shift){
+ if (retn==true) {useranswer(1,\the\QuestCount,\the\CatCount); }
+ else {if (retn==false) {useranswer(0,\the\QuestCount,\the\CatCount);}
+ else {app.alert("Probably a syntax error somewhere.");}}}
+ else
+ {app.alert("Exit the field with Shift+Click.");
+ this.getField("obj.\oField.\thequestionno").setFocus();
+ }}
+ }
+ }
+}
+\def\@@RespBoxTxtActions
+{%
+ \AA{\AAOnBlur{\JS{retn = ProcRespTxt(\rbTxtAlt);
+ if (event.shift){
+ if (retn==true) {useranswer(1,\the\QuestCount,\the\CatCount); }
+ else {if (retn==false) {useranswer(0,\the\QuestCount,\the\CatCount);}
+ else {app.alert("Probably a syntax error somewhere.");}}}
+ else
+ {app.alert("Exit the field with Shift+Click.");
+ this.getField("obj.\oField.\thequestionno").setFocus();
+ }} }%
+ \AAOnFocus{\JS{var retn = null;}}
+ }
+}
+\def\jsRespBox[#1]#2{%
+ \def\compareJSfunc{#1}\def\processJSfunc{#2}%
+ \ifeq@proofing\makebox[0pt][l]{\space\math@correctAnswer}\fi
+ \eq@TextField % send to the driver-dependent macro
+ \ \pushButton{button}{10bp}{10bp}}%
+\def\eq@@RespBoxTxt{%
+ \ifeq@proofing\makebox[0pt][l]{\space\txt@correctAnswer}\fi
+ \eq@TextField
+ \ \pushButton{button}{10bp}{10bp}}%
+\else
+\def\@@RespBoxMathActions
+{%
+ \AA{\AAKeystroke{if(event.willCommit) {
+ retn = \processJSfunc(\rbArgs,\compareJSfunc);
+ if (retn==true) {useranswer(1,\the\QuestCount,\the\CatCount); }
+ else {if (retn==false) {useranswer(0,\the\QuestCount,\the\CatCount);}
+ else {app.alert("Probably a syntax error somewhere.");}}}
+ }%
+ \AAFormat{\eqFormatArg}%
+ \AAOnFocus{\JS{var retn = null;}}%
+ }%
+}%
+\def\@@RespBoxTxtActions
+{%
+ \AA{\AAKeystroke{if(event.willCommit) {
+ retn = ProcRespTxt(\rbTxtAlt);
+ if (retn==true) {useranswer(1,\the\QuestCount,\the\CatCount); }
+ else {if (retn==false) {useranswer(0,\the\QuestCount,\the\CatCount);}
+ else {app.alert("Probably a syntax error somewhere.");}}}
+ }%
+ \AAOnFocus{\JS{var retn = null;}}
+ }
+}
+\fi %%% \ifEvalOnBlur
+% \end{macrocode}
+% Macro for typesetting the page with title (hyperref anchor), hidden
+% GrandPoohbah field and gameboard.
+% \begin{macrocode}
+\newtoks\everyCategoryHead
+\everyCategoryHead{}%
+\def\MakeGameBoard{%
+ \begin{center}%
+ \hypertarget{GameBoard}{\JeopardyTitle}%
+
+ \edef\temp{\noexpand\textField[\noexpand\Ff{\noexpand\FfReadOnly}%
+ \noexpand\F{\noexpand\FHidden}%
+ \noexpand\Q{1}%
+ \noexpand\textSize{0}%
+ \noexpand\V{\ChampionMsg}\the\GrandPoohbahtoks%
+ ]{GrandPoohbah}{\textwidth}{\the\GrandPoohbahHeight}}%
+ \temp
+
+ \leavevmode
+ \ifnum\NumberOfQuestions>0%
+ \ifnum\NumberOfCategories>0%
+ \multido{\i=1+1}{\NumberOfCategories}{\leavevmode
+ \vtop{\hsize=\CellWidth \centering
+ \the\everyCategoryHead\csname CategoryName\i\endcsname }}\\%
+ \leavevmode
+ \if@jeopardyBgPicture\insertJeopardyPicture\fi
+ \Multido{\i=1+1}{\NumberOfQuestions}%
+ {\edef\j{\i}%
+ \if@jeopardyPicture\hbox to 0 pt{\hss$\j$ }\fi
+ {\Multido{\i=1+1}{\NumberOfCategories}{%
+ \edef\temp{\noexpand\textField[%
+ \noexpand\Ff{\noexpand\FfReadOnly}%
+ \noexpand\S{S}%
+ \noexpand\Q{1}%
+ \the\Celltoks]{Field\j\i}{\CellWidth}{\CellHeight}}%
+ \hbox to 0 pt{\temp\hss}%
+ \if@jeopardyPicture
+ \pushButton[\S{B}%
+ \A{\JS{kliknuti(\j,\i);}}]{Button\j\i}{\CellWidth}{\CellHeight}%
+ \else
+ \pushButton[\S{B}\CA{\j00}%
+ \A{\JS{kliknuti(\j,\i);}}]{Button\j\i}{\CellWidth}{\CellHeight}%
+ \fi
+ }\\\leavevmode}%
+ }%
+ \fi
+ \fi
+ \par
+ \AfterGameBoard
+ \if@jeopardyPicture
+ \smallskip\leavevmode
+ \hfill\pushButton[\A{\JS{hideall();}}\CA{Solution}]{Solution}{1.5cm}{12bp}
+ \else
+ \@makeScoreField
+ \fi
+ \end{center}%
+ \newpage
+}%
+
+\def\@makeScoreField
+{
+ \ifoneplayer
+ \dimen0=\NumberOfCategories\CellWidth
+ \edef\temp{\noexpand\textField[\noexpand\V{}\noexpand\textSize{0}
+ \noexpand\Q{1}
+ \noexpand\Ff{\noexpand\FfReadOnly}
+ \the\Scoretoks
+ ]{Total.1}{\dimen0}{\ScoreCellHeight}}%
+ \temp
+ \else%two players
+ \dimen0=\NumberOfCategories\CellWidth
+ \dimen1=0.5\dimen0
+ \edef\temp{\noexpand\textField[\noexpand\V{}\noexpand\textSize{0}
+ \noexpand\Q{1}
+ \noexpand\Ff{\noexpand\FfReadOnly}
+ \the\Scoretoks
+ ]{Total.1}{\dimen1}{\ScoreCellHeight}}%
+ \temp
+ \edef\temp{\noexpand\textField[\noexpand\V{}\noexpand\textSize{0}
+ \noexpand\Q{1}
+ \noexpand\Ff{\noexpand\FfReadOnly}
+ \the\Scoretoks
+ ]{Total.2}{\dimen1}{\ScoreCellHeight}}%
+ \temp\\
+ \hbox to \hsize{\hss\hbox to \dimen0
+ {\hss
+ \radioButton[\V{1}\Ff{\FfNoToggleToOff}\A{\JS{player=1;this.getField("whoanswers").value= "\who@answers@msg{A}";}}]{radio}{12pt}{12pt}{1}
+ \hss
+ \hbox % to 0 pt
+ {\hss
+ \edef\temp{%
+ \noexpand\textField[\noexpand\Q{1}\noexpand\Ff{\noexpand\FfReadOnly}\noexpand\V{\who@answers@msg{A}}\the\Playertoks]
+ {whoanswers}{0.6\dimen0}{10pt}}\temp\hss
+ }
+ \hss
+ \radioButton[\Ff{\FfNoToggleToOff}\A{\JS{player=2;this.getField("whoanswers").value= "\who@answers@msg{B}";}}]{radio}{12pt}{12pt}{2}
+ \hss}\hss
+ }%
+ \fi
+}
+
+\let\AfterGameBoard\relax
+\edef\Goal{45*(1+numQuestions)*numQuestions*numCategories*\JeopardyScaleFactor}
+% \end{macrocode}
+% Basic Java functionality is rewritten from |jj_game.cls|. We start
+% with initial declarations.
+% \begin{macrocode}
+
+\def\update@who@answers{
+if (player==1) this.getField("whoanswers").value= "\who@answers@msg{A}";
+else this.getField("whoanswers").value= "\who@answers@msg{B}";
+}
+
+\edef\JeopardyUpdatescore
+{
+ \ifoneplayer
+ this.getField("Total.1").value="\Scoremessage: "+TotalScoreA;
+ if (TotalScoreA>0)
+ this.getField("Total.1").textColor=\correctColor;
+ else this.getField("Total.1").textColor=\wrongColor;
+ \else
+ this.getField("Total.1").value="\Scoremessage: "+TotalScoreA;
+ if (TotalScoreA>0)
+ this.getField("Total.1").textColor=\correctColor;
+ else this.getField("Total.1").textColor=\wrongColor;
+ this.getField("Total.2").value="\Scoremessage: "+TotalScoreB;
+ if (TotalScoreB>0)
+ this.getField("Total.2").textColor=\correctColor;
+ else this.getField("Total.2").textColor=\wrongColor;
+ if (player==1) {player=2; this.getField("radio").value=2;}
+ else {player=1; this.getField("radio").value=1};
+ \update@who@answers
+ \fi
+}
+
+
+
+\begin{insDLJS}[dljslibRMb]{dljsliRMb}{RMb}
+numQuestions = \the\NumberOfQuestions;
+numCategories = \the\NumberOfCategories;
+var player=1;
+RowClick=0;
+ColClick=0;
+SaveRowClick=0;
+SaveColClick=0;
+totalQuestions = numQuestions * numCategories;
+var QAed ="";
+for (var i=0; i< totalQuestions; i++)QAed +="0";
+nEM = 0;
+nCM = 0;
+var submitted = 0;
+TotalScoreA = 0;
+TotalScoreB = 0;
+NumQAed = 0;
+Goal = \Goal;
+\RightWrongMessages
+var Picture=\Picture;
+var JeopardyPass=0;
+% \end{macrocode}
+% These functions check that the page has been opened from the
+% Gameboard and save the row and column number of the button which has
+% been clicked. The OpenAction on the page is turned off after
+% answering all questions.
+% \begin{macrocode}
+
+function kontrola(row,col)
+{
+ if (NumQAed<totalQuestions)
+ {
+ var p = numQuestions*(col-1)+row-1;
+ if (row!=RowClick) gotoNamedDest("GameBoard");
+ if (col!=ColClick) gotoNamedDest("GameBoard");
+ RowClick=0;
+ ColClick=0;
+ }
+};
+
+function kliknuti(row,col)
+{RowClick=row;
+ColClick=col;
+SaveColClick=col;
+SaveRowClick=row;
+gotoNamedDest(row+""+col);
+};
+
+% \end{macrocode}
+% This function notifies the user. If the option |picture| is active,
+% it also and hides the field on Gameboard in the case of correct
+% answer.
+% \begin{macrocode}
+function useranswer(ans,rowans,colans)
+{
+ if ((rowans!=SaveRowClick) || (colans!=SaveColClick))
+ {
+ app.alert("\fairmsg");
+ gotoNamedDest("GameBoard");
+ return null;
+ }
+ row= SaveRowClick;
+ col= SaveColClick;
+ this.getField("Button"+row+col).hidden=true;
+ var p = numQuestions*(col-1)+row-1;
+ if (QAed.charAt(p)==0)
+ {
+ QAed = QAed.substring(0,p)+1+QAed.substring(p+1,totalQuestions);
+ if (ans==1)
+ {
+ if (Picture==1)
+ {
+ this.getField("Field"+row+col).hidden=true;
+ }
+ else
+ {
+ this.getField("Field"+row+col).textColor=\correctColor;
+ this.getField("Field"+row+col).value="\RightMessage";
+ }
+ if (player==1)
+ TotalScoreA += \JeopardyScaleFactor*row*100;
+ else
+ TotalScoreB += \JeopardyScaleFactor*row*100;
+ app.alert(aCM[nCM],3);
+ if (++nCM > 6) nCM=0;
+ }
+ else
+ {
+ if (Picture!=1)
+ {
+ this.getField("Field"+row+col).textColor=\wrongColor;
+ this.getField("Field"+row+col).value="\WrongMessage";
+ }
+ if (player==1)
+ TotalScoreA -= \JeopardyScaleFactor*row*100;
+ else
+ TotalScoreB -= \JeopardyScaleFactor*row*100;
+ app.alert(aEM[nEM],3);
+ if (++nEM > 6) nEM=0;
+ }
+ if ((++NumQAed>=totalQuestions) && ((TotalScoreA+TotalScoreB)>=Goal))
+ {
+ if (Picture!=1) this.getField("GrandPoohbah").hidden=false;
+ }
+ }
+ else
+ app.alert(\NotAllowedMesssage);
+ gotoNamedDest("GameBoard");
+ if (Picture!=1)
+ {
+ \JeopardyUpdatescore
+ }
+};
+% \end{macrocode}
+% This function hides in the first call all fields and buttons on the
+% gameboard and after the second call shows the |\ChampionMsg|. In
+% addition, it sets |NumQAed=totalQuestions| and the user is allowed to
+% go through the pages of the document.
+% \begin{macrocode}
+function hideall(){
+ NumQAed=totalQuestions;
+ var i=0;
+ var j=1;
+ if (JeopardyPass==0)
+ {
+ JeopardyPass=1;
+ for (var i=0; i< numQuestions; i++)
+ {
+ for (var j=0; j< numCategories; j++)
+ {
+ row=i+1; col=j+1;
+ this.getField("Field"+row+col).hidden=true;
+ this.getField("Button"+row+col).hidden=true;
+ }
+ }
+ }
+ else
+ this.getField("GrandPoohbah").hidden=false;
+}
+% \end{macrocode}
+% We redefine function used in |exerquiz| package. We will turn off
+% notification of the correct and incorrect answers by changing the
+% strokecolor of the text fields.
+% \begin{macrocode}
+function notifyField(success, flag, fieldname) {
+ return success;
+}
+\end{insDLJS}
+% \end{macrocode}
+% The fields in Acrobat have bigger dimension than their dimensions
+% visible by \TeX. From this reason they overlap a bit. The user may
+% try to remove this overlap, which is not nice together with picture,
+% using option |finetune|. This option tries to resolve this problem
+% by using smaller buttons than the |\CellWidth| and |\CellHeight|.
+% The user has to set manually the dimension |\AditionalShift| which
+% is used to shift the image vertically to adjust correct position.
+% (Sorry for the inconvenience.) I know that this solution is not
+% clean enough but \dots I did my best. At least for this verion of
+% |jeopardy| style. Look at the files |game1a.tex| and |game4.tex|.
+% You can also try to remove the option |finetune| from these files
+% and compaile again to note the difference.
+% \begin{macrocode}
+\newlength\AditionalShift
+\AditionalShift=0pt
+
+\if@jeopardyFineTune
+\newlength \finetunelength
+\newlength \finetuneCellWidth
+\newlength \finetuneCellHeight
+\finetunelength=1pt
+
+\def\insertJeopardyPicture{%
+ \dimen1=\finetunelength
+ \multiply\dimen1 by \NumberOfCategories
+ \advance\dimen1 by \GameWidth
+ \setbox\JeopardyPictureBox=%
+ \hbox{\includegraphics[width=\dimen1]{\JeopardyPictureFile}}%
+ \dimen1=\finetunelength
+ \multiply\dimen1 by \NumberOfQuestions
+ \dimen2=\ht\JeopardyPictureBox
+ \advance\dimen2 by -1.9\dimen1
+ \SetGameHeight{\dimen2}%
+ \dimen0=\CellHeight
+ \divide\dimen0 by 2
+ \hbox to 0 pt{\vbox to 0 pt{\kern -\dimen0\kern-\AditionalShift
+ \box\JeopardyPictureBox\vss}\hss}%
+}
+
+
+
+\def\MakeGameBoard{%
+ \begin{center}%
+ \fboxsep=\finetunelength
+ \fboxrule=0pt
+ \hypertarget{GameBoard}{\JeopardyTitle}%
+
+ \edef\temp{\noexpand\textField[\noexpand\Ff{\noexpand\FfReadOnly}%
+ \noexpand\F{\noexpand\FHidden}%
+ \noexpand\Q{1}%
+ \noexpand\textSize{0}%
+ \noexpand\V{\ChampionMsg}\the\GrandPoohbahtoks%
+ ]{GrandPoohbah}{\textwidth}{\the\GrandPoohbahHeight}}%
+ \temp
+
+ \leavevmode
+ \ifnum\NumberOfQuestions>0%
+ \ifnum\NumberOfCategories>0%
+ \multido{\i=1+1}{\NumberOfCategories}{\leavevmode
+ \vtop{\hsize=\CellWidth \centering
+ \the\everyCategoryHead\csname CategoryName\i\endcsname }}\\%
+ \leavevmode
+ \if@jeopardyBgPicture\insertJeopardyPicture\fi
+ \finetuneCellWidth=\CellWidth
+ \advance\finetuneCellWidth by -\finetunelength
+ \finetuneCellHeight=\CellHeight
+ \vtop{%
+ \Multido{\i=1+1}{\NumberOfQuestions}%
+ {\edef\j{\i}%
+ \hbox{%
+ \if@jeopardyPicture\hbox to 0 pt{\hss$\j$ }\fi
+ \Multido{\i=1+1}{\NumberOfCategories}{%
+ \edef\temp{\noexpand\textField[%
+ \noexpand\Ff{\noexpand\FfReadOnly}%
+ \noexpand\S{S}%
+ \noexpand\Q{1}%
+ \the\Celltoks]{Field\j\i}{\finetuneCellWidth}{\finetuneCellHeight}}%
+ \fbox{\hbox to 0 pt{\temp\hss}%
+ \if@jeopardyPicture
+ \pushButton[\S{B}%
+ \A{\JS{kliknuti(\j,\i);}}]{Button\j\i}{\finetuneCellWidth}{\finetuneCellHeight}%
+ \else
+ \pushButton[\S{B}\CA{\j00}%
+ \A{\JS{kliknuti(\j,\i);}}]{Button\j\i}{\finetuneCellWidth}{\finetuneCellHeight}%
+ \fi%
+ }}}\kern-1pt
+ }}%
+ \fi %%% \ifnum\NumberOfQuestions>0%
+ \fi %%% \ifnum\NumberOfCategories>0%
+ \par
+ \AfterGameBoard
+ \if@jeopardyPicture
+ \smallskip\leavevmode
+ \hfill\pushButton[\A{\JS{hideall();}}\CA{Solution}]{Solution}{1.5cm}{12bp}
+ \else%not picture
+ \@makeScoreField
+ \fi
+ \end{center}%
+ \newpage
+}%
+\fi
+
+% \end{macrocode}
+% The user may write his/her customizations into jeopardy.cfg.
+% \begin{macrocode}
+\IfFileExists{jeopardy.cfg}{%
+ \typeout{---------------------------------------------------}
+ \typeout{jeopardy: Configuration from the file jeopardy.cfg.}
+ \typeout{---------------------------------------------------}
+ \input jeopardy.cfg}{}
+%</package>
+% \end{macrocode}
+% We define shorter navigation panel if |pdfscreen.sty| package is used.
+% \begin{macrocode}
+%<*cfg>
+\ifx\NavigationPanel\undefined\else
+\def\NavigationPanel{\normalsfcodes%
+ \href{\@urlid}{\addButton{\buttonwidth}{\tiny\@Panelhomepagename}}\\ \pfill
+ \hyperlink{GameBoard}{\addButton{\buttonwidth}{\tiny GameBoard}}\\ \pfill
+ \Acrobatmenu{FullScreen}{\addButton{\buttonwidth}{\tiny\@Panelfullscreenname}}\\\pfill
+ \Acrobatmenu{Close}{\addButton{\buttonwidth}{\tiny\@Panelclosename}}\\\pfill
+ \Acrobatmenu{Quit}{\addButton{\buttonwidth}{\tiny\@Panelquitname}}\\
+}
+\fi
+\def\PDFSCR@Warning#1{}
+%</cfg>
+% \end{macrocode}
+% \Finale
+\endinput