Cómo desarmar opciones como configurar opciones con DeclareOption, una especie de UndeclareOption

Cómo desarmar opciones como configurar opciones con DeclareOption, una especie de UndeclareOption

Creé una clase que adapta la clase de examen a las necesidades de mi escuela y agregué algunas cosas para controlar la clase desde afuera mediante un script para poder crear un examen individual para cada estudiante con el nombre e información adicional impresa en él. Todo esto está controlado por un script bash externo. Utilizo algo así como pdflatex "\newcommand\examstudentname{somestudent} \newcommand\externalwithanswers{no}" the_exam.texdesde dentro del script bash para generar el pdf del examen. Como en el the_exam.texarchivo puede suceder que la opción [answers]se haya configurado accidentalmente, se podría crear un examen con las respuestas incluidas (de hecho, algo así pasó una vez en nuestra escuela). Para tener un control total, necesito el script para configurar y desarmar opciones como las [answers]de la clase que heredé de ( exam.cls).

Caso 1: Mi the_exam.texpodría tener:

\documentclass{HTWChurExam}

HTWChurExam.clstiene algo como:

\PassOptionsToClass{answers}{exam}

Esto se activa deliberadamente [answers]durante exam.cls. No hay problema, arreglado. Fácil de controlar desde fuera mediante un script.

Caso 2: Mi the_exam.texpodría tener:

\documentclass[answers]{HTWChurExam}

HTWChurExam.clstiene algo como:

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

que pasará todas las opciones a exam.cls. Ahora quiero tener la posibilidad de girar deliberadamenteapagado [answers], controlado por un script bash.

No he encontrado ninguna manera de lograr esto.

Respuesta1

Mi solución es:

\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
} %
{}%

La clave es pasar la opción answera la clase examsolo cuando, a partir de todas las condiciones combinadas, esté seguro de que realmente es necesario mostrar las respuestas. Gracias de todos modos por ayudarme, ya que de alguna manera desencadenó mi solución.

información relacionada