% \iffalse meta-comment
% An Infrastructure for Problems 
% Copyright (c) 2006-2008 Michael Kohlhase, all rights reserved
%               this file is released under the
%               LaTeX Project Public License (LPPL)
% The original of this file is in the public repository at 
% http://github.com/KWARC/sTeX/
% \fi
% 
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{problem}[2019/03/20 v1.3 Semantic Markup for Problems]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage{url,float,xspace}
\usepackage[solutions,hints,notes]{problem}
\usepackage[show]{ed}
\usepackage[hyperref=auto,style=alphabetic]{biblatex}
\addbibresource{kwarcpubs.bib}
\addbibresource{extpubs.bib}
\addbibresource{kwarccrossrefs.bib}
\addbibresource{extcrossrefs.bib}
\usepackage{stex-logo}
\usepackage{ctangit}
\usepackage{hyperref}
\makeindex
\def\latexml{\hbox{{\LaTeX}ML}\xspace}
\floatstyle{boxed}
\newfloat{exfig}{thp}{lop}
\floatname{exfig}{Example}
\def\githubissue#1{\cite{sTeX:github:on}, \hyperlink{https://github.com/KWARC/sTeX/issues/#1}{issue #1}}
\begin{document}
\RecordChanges
\DocInput{problem.dtx}
\end{document}
%</driver>
% \fi
% 
% \CheckSum{318}
%
% \changes{v0.9}{2006/09/18}{First Version with Documentation}
% \changes{v0.9a}{2007/01/02}{Renamed to \texttt{problem.sty}}
% \changes{v0.9c}{2010/01/03}{based on \texttt{omd.sty} now}
% \changes{v1.0}{2013/10/09}{adding \texttt{\textbackslash start/stopsolution}}
% \changes{v1.1}{2013/12/12}{adding MathHub support}
% \changes{v1.2}{2015/11/04}{moving MathHub support out to separate package}
% \changes{v1.3}{2018/11/23}{Addint Multiple Choice Blocks}
% 
% \GetFileInfo{problem.sty}
% 
% \MakeShortVerb{\|}
%
% \title{\texttt{problem.sty}: An Infrastructure for formatting Problems\thanks{Version {\fileversion} (last revised
%        {\filedate})}}
%    \author{Michael Kohlhase\\
%            FAU Erlangen-N\"urnberg\\
%            \url{http://kwarc.info/kohlhase}}
% \maketitle
%
% \begin{abstract}
%   The |problem| package supplies an infrastructure that allows specify problems and to
%   reuse them efficiently in multiple environments.
% \end{abstract}
% \setcounter{tocdepth}{2}\tableofcontents\newpage
%
%\section{Introduction}\label{sec:intro}
%
% The |problem| package supplies an infrastructure that allows specify problem.  Problems
% are text fragments that come with auxiliary functions: hints, notes, and
% solutions\footnote{for the moment multiple choice problems are not supported, but may
%   well be in a future version}. Furthermore, we can specify how long the solution to a
% given problem is estimated to take and how many points will be awarded for a perfect
% solution.
% 
% Finally, the |problem| package facilitates the management of problems in small files,
% so that problems can be re-used in multiple environment. 
% 
% \section{The User Interface}\label{sec:ui}
%
% \subsection{Package Options}
% The |problem| package takes the options \DescribeMacro{solutions}|solutions| (should
% solutions be output?), \DescribeMacro{notes}|notes| (should the problem notes be
% presented?), \DescribeMacro{hints}|hints| (do we give the hints?),
% \DescribeMacro{pts}|pts| (do we display the points awarded for solving the problem?),
% \DescribeMacro{min}|min| (do we display the estimated minutes for problem soling). If
% theses are specified, then the corresponding auxiliary parts of the problems are output,
% otherwise, they remain invisible.
% 
% The \DescribeMacro{boxed}|boxed| option specifies that problems should be formatted in
% framed boxes so that they are more visible in the text. Finally, the
% \DescribeMacro{test}|test| option signifies that we are in a test situation, so this
% option does not show the solutions (of course), but leaves space for the students to
% solve them.
% 
% Finally, if the \DescribeMacro{showmeta}|showmeta| is set, then the metadata keys are
% shown (see~\cite{Kohlhase:metakeys:ctan} for details and customization options).
% 
% \subsection{Problems and Solutions}\label{sec:user:probsols}
%
% \DescribeEnv{problem} The main environment provided by the |problem| package is
% (surprise surprise) the |problem| environment. It is used to mark up problems and
% exercises. The environment takes an optional KeyVal argument with the keys
% \DescribeMacro{id}|id| as an identifier that can be reference later,
% \DescribeMacro{pts}|pts| for the points to be gained from this exercise in homework or
% quiz situations, \DescribeMacro{min}|min| for the estimated minutes needed to solve the
% problem, and finally \DescribeMacro{title}|title| for an informative title of the
% problem. For an example of a marked up problem see Figure~\ref{fig:problem} and the
% resulting markup see Figure~\ref{fig:result}. 
%
%\begin{exfig}
% \begin{verbatim}
% \usepackage[solutions,hints,pts,min]{problem}
% \begin{document}
%   \begin{problem}[id=elefants,pts=10,min=2,title=Fitting Elefants]
%     How many Elefants can you fit into a Volkswagen beetle?
% \begin{hint}
%   Think positively, this is simple!
% \end{hint}
% \begin{exnote}
%   Justify your answer
% \end{exnote}
% \begin{solution}[for=elefants,height=3cm]
%   Four, two in the front seats, and two in the back.
% \end{solution}
%   \end{problem}
% \end{document}
% \end{verbatim}
% \caption{A marked up Problem}\label{fig:problem}
% \end{exfig}
%
% \DescribeEnv{solution} The |solution| environment can be to specify a solution to a
% problem. If the \DescribeMacro{solutions}|solutions| option is set or |\solutionstrue|
% is set in the text, then the solution will be presented in the output. The |solution|
% environment takes an optional KeyVal argument with the keys \DescribeMacro{id}|id| for
% an identifier that can be reference \DescribeMacro{for}|for| to specify which problem
% this is a solution for, and \DescribeMacro{height}|height| that allows to specify the
% amount of space to be left in test situations (i.e. if the \DescribeMacro{test}|test|
% option is set in the |\usepackage| statement).
%
%\begin{exfig}
% \begin{minipage}{.9\linewidth}
% \begin{problem}[id=elefants.prob,title=Fitting Elefants]
%   How many Elefants can you fit into a Volkswagen beetle?
% \begin{hint}
%   Think positively, this is simple!
% \end{hint}
% \begin{exnote}
%   Justify your answer
% \end{exnote}
% \smallskip\noindent\hrule\textbf{Solution:}
%   Four, two in the front seats, and two in the back.
% \hrule
% \end{problem}
% \end{minipage}
% \caption{The Formatted Problem from Figure~\ref{fig:problem}}\label{fig:result}
% \end{exfig}
% 
% \DescribeEnv{hint}\DescribeEnv{note}, the |hint| and |exnote| environments can be used
% in a |problem| environment to give hints and to make notes that elaborate certain aspects
% of the problem.
%
% Sometimes we would like to locally override the |solutions| option we have given to the
% package. To turn on solutions we use the
% \DescribeMacro{\startsolutions}|\startsolutions|, to turn them off,
% \DescribeMacro{\stopsolutions}|\stopsolutions|. These two can be used at any point in
% the documents. 
%
% \subsection{Multiple Choice Blocks}\label{sec:user:mcq}
% 
% Multiple choice blocks can be formatted using the \DescribeMacro{mcb}|mcb| environment,
% in which single choices are marked up with
% \DescribeMacro{\mcc}|\mcc[|\meta{keyvals}|]{|\meta{text}|}| macro, which takes an
% optional key/value argument \meta{keyvals} for choice metadata and a required argument
% \meta{text} for the proposed answer text. The following keys are supported
% \begin{itemize}
% \item \DescribeMacro{T}|T| for true answers, \DescribeMacro{F}|F| for false ones,
% \item \DescribeMacro{Ttext}|Ttext| the verdict for true answers,
%   \DescribeMacro{Ftext}|Ftext| for false ones, and
% \item \DescribeMacro{feedback}|feedback| for a short feedback text given to the student.
% \end{itemize}
% See Figure~\ref{fig: mcq} for an example
%\begin{exfig}
% \begin{verbatim}
% \begin{problem}[title=Functions]
%   What is the keyword to introduce a function definition in python?
%   \begin{mcb}
%     \mcc[T]{def}
%     \mcc[F,feedback=that is for C and C++]{function}
%     \mcc[F,feedback=that is for Standard ML]{fun}
%     \mcc[F,Ftext=Nooooooooo,feedback=that is for Java]{public static void}
%   \end{mcb}
% \end{problem}
% \end{verbatim}
%  \solutionsfalse\hrule
% \begin{problem}[title=Functions]
%   What is the keyword to introduce a function definition in python?
%   \begin{mcb}
%     \mcc[T]{def}
%     \mcc[F,feedback=that is for C and C++]{function}
%     \mcc[F,feedback=that is for Standard ML]{fun}
%     \mcc[F,Ftext=Nooooooooo,feedback=that is for Java]{public static void}
%   \end{mcb}
% \end{problem}
% \solutionstrue\hrule
% \begin{problem}[title=Functions]
%   What is the keyword to introduce a function definition in python?
%   \begin{mcb}
%     \mcc[T]{def}
%     \mcc[F,feedback=that is for C and C++]{function}
%     \mcc[F,feedback=that is for Standard ML]{fun}
%     \mcc[F,Ftext=Nooooooooo,feedback=that is for Java]{public static void}
%   \end{mcb}
% \end{problem}
% \caption{A Problem with a multiple choice block}\label{fig:mcq}
% \end{exfig}
% 
% \subsection{Including Problems}\label{sec:user:includeproblem}
% 
% The \DescribeMacro{\includeproblem}|\includeproblem| macro can be used to include a
% problem from another file. It takes an optional KeyVal argument and a second argument
% which is a path to the file containing the problem (the macro assumes that there is only
% one problem in the include file). The keys \DescribeMacro{title}|title|,
% \DescribeMacro{min}|min|, and \DescribeMacro{pts}|pts| specify the problem title, the
% estimated minutes for solving the problem and the points to be gained, and their values
% (if given) overwrite the ones specified in the |problem| environment in the included
% file.
% 
% \subsection{Reporting Metadata}\label{sec:user:reporting}
% 
% The sum of the points and estimated minutes (that we specified in the |pts| and |min|
% keys to the |problem| environment or the |\includeproblem| macro) to the log file and
% the screen after each run. This is useful in preparing exams, where we want to make sure
% that the students can indeed solve the problems in an allotted time period.
% 
% The |\min| and |\pts| macros allow to specify (i.e. to print to the margin) the
% distribution of time and reward to parts of a problem, if the |pts| and |pts| package
% options are set. This allows to give students hints about the estimated time and the
% points to be awarded.
%
% \section{Limitations}\label{sec:limitations}
% 
% In this section we document known limitations. If you want to help alleviate them,
% please feel free to contact the package author. Some of them are currently discussed in
% the \sTeX GitHub repository~\cite{sTeX:github:on}. 
% \begin{enumerate}
% \item none reported yet
% \end{enumerate}
% 
% \StopEventually{\newpage\PrintChanges}
% \newpage
%
% \section{The Implementation}\label{sec:implementation}
%
% \subsection{Package Options}\label{sec:impl:options}
% 
% The first step is to declare (a few) package options that handle whether certain
% information is printed or not. They all come with their own conditionals that are set by
% the options.
%
%    \begin{macrocode}
%<*package>
\newif\if@problem@mh@\@problem@mh@false
\DeclareOption{mh}{\@problem@mh@true}
\newif\ifexnotes\exnotesfalse
\DeclareOption{notes}{\exnotestrue}
\newif\ifhints\hintsfalse
\DeclareOption{hints}{\hintstrue}
\newif\ifsolutions\solutionsfalse
\DeclareOption{solutions}{\solutionstrue}
\newif\ifpts\ptsfalse
\DeclareOption{pts}{\ptstrue}
\newif\ifmin\minfalse
\DeclareOption{min}{\mintrue}
\newif\ifboxed\boxedfalse
\DeclareOption{boxed}{\boxedtrue}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{omtext}}
\ProcessOptions
%    \end{macrocode}
%
% Then we make sure that the necessary packages are loaded (in the right versions).
%    \begin{macrocode}
\if@problem@mh@\RequirePackage{problem-mh}\fi
\RequirePackage{omtext}
\RequirePackage{comment}
\RequirePackage{mdframed}
\RequirePackage[base]{babel}
%    \end{macrocode}
%
% \begin{macro}{\prob@*@kw}
%   For multilinguality, we define internal macros for keywords that can be specialized in
%   |*.ldf| files. 
%    \begin{macrocode}
\AfterBabelLanguage{ngerman}{\input{problem-ngerman.ldf}}
\AfterBabelLanguage{arabic}{\input{problem-arabic.ldf}}
\def\prob@problem@kw{Problem}
\def\prob@solution@kw{Solution}
%    \end{macrocode}
% \end{macro}
% 
% \subsection{Problems and Solutions}\label{sec:impl:probsols}
% 
% We now prepare the KeyVal support for problems. The key macros just set appropriate
% internal macros.
%
%    \begin{macrocode}
\srefaddidkey[prefix=prob.]{problem}
\addmetakey{problem}{pts}
\addmetakey{problem}{min}
\addmetakey*{problem}{title}
\addmetakey{problem}{refnum}
%    \end{macrocode}
%
% Then we set up a counter for problems.
% \begin{macro}{\numberproblemsin}
%    \begin{macrocode}
\newcounter{problem}
\newcommand\numberproblemsin[1]{\@addtoreset{problem}{#1}}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\prob@label}
%   We provide the macro |\prob@label| to redefine later to get context involved. 
%    \begin{macrocode}
\newcommand\prob@label[1]{#1} 
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\prob@number}
%   We consolidate the problem number into a reusable internal macro
% \begin{macrocode}
\newcommand\prob@number{%
\ifx\inclprob@refnum\@empty% if there is no outside refnumb
\ifx\problem@refnum\@empty\prob@label\theproblem%
\else\prob@label\problem@refnum\fi%
\else\prob@label\inclprob@refnum\fi}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\prob@title}
%   We consolidate the problem title into a reusable internal macro as well. |\prob@title|
%   takes three arguments the first is the fallback when no title is given at all, the
%   second and third go around the title, if one is given.
% \begin{macrocode}
\newcommand\prob@title[3]{%
\ifx\inclprob@title\@empty% if there is no outside title
\ifx\problem@title\@empty{#1}\else{#2\problem@title{#3}}\fi
\else{#2}\inclprob@title{#3}\fi}% else show the outside title
%    \end{macrocode}
% \end{macro}
% 
% With these the problem header is a one-liner
%
% \begin{macro}{\prob@heading}
%   We consolidate the problem header line into a separate internal macro that can be
%   reused in various settings. 
% \begin{macrocode}
\def\prob@heading{\prob@problem@kw~\prob@number\prob@title{ }{ (}{)\strut\\}%
\sref@label@id{\prob@problem@kw~\prob@number}}
%    \end{macrocode}
% \end{macro}
% 
% With this in place, we can now define the |problem| environment. It comes in two shapes,
% depending on whether we are in boxed mode or not. In both cases we increment the problem
% number and output the points and minutes (depending) on whether the respective options
% are set.
% \begin{environment}{problem}
%    \begin{macrocode}
\newenvironment{problem}[1][]{\metasetkeys{problem}{#1}\sref@target%
\@in@omtexttrue% we are in a statement (for inline definitions)
\stepcounter{problem}\record@problem%
\def\current@section@level{\prob@problem@kw}%
\par\noindent\textbf\prob@heading\show@pts\show@min\rmfamily\noindent\ignorespaces}
{\smallskip}
\ifboxed\surroundwithmdframed{problem}\fi
%    \end{macrocode}
% \end{environment}
% 
% \begin{macro}{\record@problem}
%   This macro records information about the problems in the |*.aux| file. 
%    \begin{macrocode}
\def\record@problem{\protected@write\@auxout{}%
{\string\@problem{\prob@number}%
{\ifx\inclprob@pts\@empty\problem@pts\else\inclprob@pts\fi}%
{\ifx\inclprob@min\@empty\problem@min\else\inclprob@min\fi}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@problem}
%   This macro acts on a problem's record in the |*.aux| file. It does not have any
%   functionality here, but can be redefined elsewhere (e.g. in the |assignment|
%   package). 
%    \begin{macrocode}
\def\@problem#1#2#3{}
%    \end{macrocode}
% \end{macro}
% 
% The \DescribeEnv{solution}|solution| environment is similar to the |problem|
% environment, only that it is independent of the boxed mode. It also has it's own keys
% that we need to define first.
% 
%    \begin{macrocode}
\srefaddidkey{soln}
\addmetakey{soln}{for}
\addmetakey{soln}{height}
\addmetakey{soln}{creators}
\addmetakey{soln}{contributors}
\addmetakey{soln}{srccite}
%    \begin{macrocode}
% the next step is to define a helper macro that does what is needed to start a solution. 
%    \begin{macrocode}
\newcommand\@startsolution[1][]{\metasetkeys{soln}{#1}%
\@in@omtexttrue% we are in a statement.
\ifboxed\else\hrule\fi\smallskip\noindent{\textbf\prob@solution@kw: }\begin{small}%
\def\current@section@level{\prob@solution@kw}%
\ignorespaces}
%    \end{macrocode}
%
% \begin{macro}{\startsolutions}
% for the |\startsolutions| macro we use the |\specialcomment| macro from the |comment|
% package. Note that we use the |\@startsolution| macro in the start codes, that parses
% the optional argument. 
%    \begin{macrocode}
\newcommand\startsolutions{\specialcomment{solution}{\@startsolution}%
{\ifboxed\else\hrule\medskip\fi\end{small}}%
\ifboxed\surroundwithmdframed{solution}\fi}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\stopsolutions}
%    \begin{macrocode}
\newcommand\stopsolutions{\excludecomment{solution}}
%    \end{macrocode}
% \end{macro}
% 
% so it only remains to start/stop solutions depending on what option was specified.
%
%    \begin{macrocode}
\ifsolutions\startsolutions\else\stopsolutions\fi
%    \end{macrocode}
%
%    \begin{macrocode}
\ifexnotes
\newenvironment{exnote}[1][]%
{\par\smallskip\hrule\smallskip\noindent\textbf{Note: }\small}
{\smallskip\hrule}
\else%ifexnotes
\excludecomment{exnote}
\fi%ifexnotes
\ifhints
\newenvironment{hint}[1][]%
{\par\smallskip\hrule\smallskip\noindent\textbf{Hint: }\small}
{\smallskip\hrule}
\newenvironment{exhint}[1][]%
{\par\smallskip\hrule\smallskip\noindent\textbf{Hint: }\small}
{\smallskip\hrule}
\else%ifhints
\excludecomment{hint}
\excludecomment{exhint}
\fi%ifhints
%    \end{macrocode}
% 
% \subsection{Multiple Choice Blocks}\label{sec:impl:mcq}
%
% \begin{environment}{mcb}
%   \ednote{MK: maybe import something better here from a dedicated MC package}
%    \begin{macrocode}
\newenvironment{mcb}
{\begin{enumerate}}
{\end{enumerate}}
%    \end{macrocode}
% \end{environment}
% we define the keys for the |mcc| macro
%    \begin{macrocode} 
\srefaddidkey{mcc}
\addmetakey{mcc}{feedback}
\addmetakey[T]{mcc}{T}
\addmetakey[F]{mcc}{F}
\addmetakey[Yes]{mcc}{Ttext}
\addmetakey[No]{mcc}{Ftext}
%    \end{macrocode}
%
% \begin{macro}{\mcc}
%    \begin{macrocode}
\newcommand\mcc[2][]{%
\metasetkeys{mcc}{#1}%
\item #2%
\ifsolutions\\%
\ifcsstring{mcc@T}{T}{}{\mcc@Ttext}%
\ifcsstring{mcc@F}{F}{}{\mcc@Ftext}%
\ifx\mcc@feedback\@empty!\else, \mcc@feedback\fi%
\fi} %solutions
%    \end{macrocode}
% \end{macro}
% 
% \subsection{Including Problems}\label{sec:impl:includeproblem}
%
% \begin{macro}{\includeproblem}
%   The |\includeproblem| command is essentially a glorified |\input| statement, it sets
%   some internal macros first that overwrite the local points. Importantly, it resets the
%   |inclprob| keys after the input. 
%    \begin{macrocode}
\addmetakey{inclprob}{pts}
\addmetakey{inclprob}{min}
\addmetakey*{inclprob}{title}
\addmetakey{inclprob}{refnum}
\addmetakey{inclprob}{mhrepos}
\clear@inclprob@keys%initially
\newcommand\includeproblem[2][]{\metasetkeys{inclprob}{#1}%
\input{#2}\clear@inclprob@keys}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Reporting Metadata}
%
%    \begin{macrocode}
\def\pts#1{\ifpts\marginpar{#1 pt}\fi}
\def\min#1{\ifmin\marginpar{#1 min}\fi}
%    \end{macrocode}
%
%    \begin{macrocode}
\AtEndDocument{\ifpts\message{Total: \arabic{pts} points}\fi
\ifmin\message{Total: \arabic{min} minutes}\fi}
%    \end{macrocode}
%
% \begin{macro}{\show@pts}
%   The |\show@pts| shows the points: if no points are given from the outside and also no
%   points are given locally do nothing, else show and add. If there are outside points
%   then we show them in the margin.
%    \begin{macrocode}
\newcounter{pts}
\def\show@pts{\ifx\inclprob@pts\@empty%
\ifx\problem@pts\@empty\else%
\ifpts\marginpar{\problem@pts pt\smallskip}\addtocounter{pts}{\problem@pts}\fi%
\fi\else% inclprob@pts nonempty
\ifpts\marginpar{\inclprob@pts pt\smallskip}\addtocounter{pts}{\inclprob@pts}\fi%
\fi}
%    \end{macrocode}
% \end{macro}
% and now the same for the minutes
% \begin{macro}{\show@min}
%    \begin{macrocode}
\newcounter{min}
\def\show@min{\ifx\inclprob@min\@empty%
\ifx\problem@min\@empty\else%
\ifmin\marginpar{\problem@min min}\addtocounter{min}{\problem@min}\fi%
\fi\else%
\ifmin\marginpar{\inclprob@min min}\addtocounter{min}{\inclprob@min}\fi
\fi}
%</package>
%    \end{macrocode}
% \end{macro}
% \Finale
\endinput
% \iffalse
% LocalWords:  GPL structuresharing STR dtx pts keyval xcomment CPERL DefKeyVal iffalse
%%% Local Variables: 
%%% mode: doctex
%%% TeX-master: t
%%% End: 
% \fi
% LocalWords:  RequirePackage Semiverbatim DefEnvironment OptionalKeyVals soln texttt baz
% LocalWords:  exnote DefConstructor inclprob NeedsTeXFormat omd.sty textbackslash exfig
%  LocalWords:  stopsolution fileversion filedate maketitle setcounter tocdepth newpage
%  LocalWords:  tableofcontents showmeta showmeta solutionstrue usepackage minipage hrule
%  LocalWords:  linewidth elefants.prob Elefants smallskip noindent textbf startsolutions
%  LocalWords:  startsolutions stopsolutions stopsolutions includeproblem includeproblem
%  LocalWords:  textsf HorIacJuc cscpnrr11 includemhproblem includemhproblem importmodule
%  LocalWords:  importmhmodule foobar ldots latexml mhcurrentrepos mh-variants mh-variant
%  LocalWords:  compactenum langle rangle langle rangle ltxml metakeys newif ifexnotes rm
%  LocalWords:  exnotesfalse exnotestrue ifhints hintsfalse hintstrue ifsolutions ifpts
%  LocalWords:  solutionsfalse ptsfalse ptstrue ifmin minfalse mintrue ifboxed boxedfalse
%  LocalWords:  boxedtrue sref mdframed marginpar prob srefaddidkey addmetakey refnum kv
%  LocalWords:  newcounter ifx thesection theproblem hfill newenvironment metasetkeys ltx
%  LocalWords:  stepcounter currentsectionlevel xspace ignorespaces surroundwithmdframed
%  LocalWords:  omdoc autoopen autoclose solvedinminutes kvi qw vals newcommand exhint
%  LocalWords:  specialcomment excludecomment mhrepos xref marginpar addtocounter doctex
%  LocalWords:  mh@currentrepos endinput

