So löschen Sie Optionen, z. B. das Setzen von Optionen mit DeclareOption, einer Art UndeclareOption

So löschen Sie Optionen, z. B. das Setzen von Optionen mit DeclareOption, einer Art UndeclareOption

Ich habe eine Klasse erstellt, die die Prüfungsklasse an die Bedürfnisse meiner Schule anpasst, und einige Dinge hinzugefügt, um die Klasse von außen über ein Skript zu steuern, damit ich für jeden Schüler eine individuelle Prüfung erstellen kann, auf der der Name und zusätzliche Informationen gedruckt werden. All dies wird über ein externes Bash-Skript gesteuert. Ich verwende so etwas wie pdflatex "\newcommand\examstudentname{somestudent} \newcommand\externalwithanswers{no}" the_exam.texinnerhalb des Bash-Skripts, um das Prüfungs-PDF zu generieren. Wie in der the_exam.texDatei kann es vorkommen, dass die Option [answers]versehentlich gesetzt wurde, sodass eine Prüfung mit enthaltenen Antworten erstellt wird (tatsächlich ist so etwas einmal an unserer Schule passiert). Um die vollständige Kontrolle zu haben, muss ich das Skript verwenden, um Optionen wie [answers]die der Klasse zu setzen und aufzuheben, die ich von ( exam.cls) geerbt habe.

Fall 1: Mein the_exam.texFall könnte sein:

\documentclass{HTWChurExam}

HTWChurExam.clshat so etwas wie:

\PassOptionsToClass{answers}{exam}

Dies wird absichtlich [answers]für aktiviert exam.cls. Kein Problem, erledigt. Einfache Steuerung von außen über ein Skript.

Fall 2: Mein the_exam.texFall könnte sein:

\documentclass[answers]{HTWChurExam}

HTWChurExam.clshat so etwas wie:

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{exam}}

wodurch alle Optionen an exam.cls weitergegeben werden. Ich möchte nun die Möglichkeit haben, gezieltaus [answers], gesteuert durch ein Bash-Skript.

Ich habe keine Möglichkeit gefunden, dies zu erreichen.

Antwort1

Meine Lösung ist:

\providecommand{\externalwithanswers}{}% fallback definition
\newcommand{\withname}{yes}
\newcommand{\withscoretable}{yes}
\newcommand{\withpagescore}{yes}
\newcommand{\withanswers}{}
\newcommand{\withanswersnewpage}{}
\newcommand{\noanswersnewpage}{\newpage}
\newcommand{\withanswerslinebreak}{}
\newcommand{\useanswers}%
{%use answers
    \typeout{HTWChurExam class: using answers}
    \renewcommand{\withanswers}{(mit Anworten)}%
    \renewcommand{\withanswersnewpage}{\newpage} %
    \renewcommand{\noanswersnewpage}{} %
    \renewcommand{\withanswerslinebreak}{\linebreak} %
}
\newcommand{\usenoanswers}%
{%do not use answers
    \typeout{HTWChurExam class: not using answers}
    \renewcommand{\withanswers}{}
    \renewcommand{\withanswersnewpage}{}
    \renewcommand{\noanswersnewpage}{\newpage}
    \renewcommand{\withanswerslinebreak}{}
}
\typeout{HTWChurExam class: default answer display}
\usenoanswers
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{exam}}
\DeclareOption{answers}%
{%
    \typeout{\currfilebase: using answers requested}
    %test if external script call supersedes using answers with 'no' option
    \ifthenelse{\equal{no}{\externalwithanswers}} %
    {%if external answerdefinition is 'no'
        \typeout{HTWChurExam class: external scipt call -> using no answers}
    }%
    {%if external answerdefinition is not 'no'
        \PassOptionsToClass{answers}{exam}
        \useanswers
    }%
}

%test for external withanswer 'yes' option
\ifthenelse{\equal{yes}{\externalwithanswers}} %
{ %if external answerdefinition is 'yes'
    \typeout{HTWChurExam class: external scipt call -> using answers}
    \PassOptionsToClass{answers}{exam}
    \useanswers
} %
{}%

answerDer Schlüssel besteht darin, die Option nur dann an die Klasse weiterzugeben, examwenn aus allen kombinierten Bedingungen klar ist, dass die Antworten wirklich angezeigt werden müssen. Trotzdem vielen Dank für Ihre Hilfe, denn das hat meine Lösung gewissermaßen ausgelöst.

verwandte Informationen