Prüfungsklasse: Beste Möglichkeit, den Befehl \question neu zu definieren, um benutzerdefinierte Formatierung anzuwenden

Prüfungsklasse: Beste Möglichkeit, den Befehl \question neu zu definieren, um benutzerdefinierte Formatierung anzuwenden

EDIT: Zusammenfassend ist die Antwort wirklich elegant und einfach ausgefallen. Vielen Dank für alle Antworten unten!

\usepackage{etoolbox}
%...
\renewcommand\questionshook{\preto{\question}{\large\bfseries}}

% If we don't want the question's parts to be huge as well!
%\renewcommand\partshook{\normalsize\normalfont}

Kurz gesagt möchte ich eine benutzerdefinierte Prüfungsblatt-Dokumentenklasse generieren, basierend auf demexamKlassezur Verwendung in einer Gruppe von Kollegen. Zu diesem Zweck möchte ich den Standardbefehl neu definieren, \questionum eine benutzerdefinierte Formatierung anzuwenden.

Angenommen, ich möchte den Standardabschnitt groß und fett darstellen \question. Ich mache jetzt Folgendes:

\newcommand\lquestion{\large\bfseries\question}

Um meine benutzerdefinierte Formatierung zu verwenden, muss ich stattdessen Folgendes in meine Dokumente schreiben:

\begin{lquestion}
A large and bold question: what is the mass of the sun?
\end{lquestion}

(Ich habe gelesen, dass die Verwendung von Befehlen als Umgebungen in LaTeX in Ordnung ist, aber korrigieren Sie mich, wenn sich dahinter einige Fallstricke verbergen.)

Was wäre die beste Möglichkeit question, den von stammenden Befehl exam.clsals Umgebung neu zu definieren, sodass ich diesen Bonus nicht lam Anfang der Umgebung voranstellen muss und questionstattdessen den standardmäßig enthaltenen Namen verwenden kann?

EDIT: Ein minimales funktionierendes Beispiel:

\documentclass{exam}
\usepackage[utf8]{inputenc}

\title{MWE}
\author{John Doe}
\date{November 2020}

%print solutions by default (for MWE's sake)
\printanswers
% do not put a box/frame around printed solutions
\unframedsolutions

\begin{document}

\maketitle

\begin{questions}
    %this is basically what I want the result to look like:
    {\large\bfseries
        \question My large and bold question:
        \begin{parts}
        \part First part
        \part Second part
        \end{parts}
    }
    %but instead of this rather inconvenient form, I want to define an environment {question} with the same effect and use it like:
    %
    % \begin{question}
    % My large and bold question:
    % \begin{parts}
    %     \part First part
    %     \part Second part
    % \end{parts}
    % \end{question}
    
    
    \begin{solution}
    My general solution prerequisite.
    \begin{parts}
        \part My first part solution
        \part My second part solution
    \end{parts}
    \end{solution}
\end{questions}

\end{document}

Die \questionDefinition von findet sich in Zeile 2845 inexam.clsinnerhalb der questionsUmgebung:


\newenvironment{questions}{%
  %.... lots of code here
  \def\question{%
    \@bonusfalse
    \def\thequestiontitle{\csname p@question\endcsname
                          \csname thequestion\endcsname}%
    \process@question
  }%
  %.... lots of other code here
%and waaaaay down on line 3143
}% End of the second argument of \newenvironment{questions}

Dank im Voraus!

Antwort1

Sie haben anscheinend bereits herausgefunden, dass Sie einen Befehl als Umgebung verwenden können. Ihre Frage lautet also eigentlich: „Wie kann ich den questionBefehl neu definieren, sodass er \large\bfseriesam Anfang steht?“ Das Problem, das Sie entdeckt haben, ist, dass die questionsUmgebung den Befehl definiert \question. In diesem Fall funktioniert Ihr Beispiel wahrscheinlich mit

\usepackage{etoolbox}
\appto{\questions}{%
 \preto{\question}{\large\bfseries}%
 \printanswers%
}

Ich bin nicht glücklich darüber, dass ich es \printanswersdort haben muss, aber die Lösungen verschwinden sonst. Sie müssen also möglicherweise zwei verschiedene \printanswersBefehle im Auge behalten.

Zur Frage der Umgebung: \begin{myenv}...\end{myenv}wird zu \begingroup\myenv ...\endmyenv\endgroup, (wobei \endmyenvkein Fehler auftritt, wenn es nicht vorhanden ist). Das Ergebnis ist, dass Sie Ihr automatisch gruppieren, \large\bfseriessodass es den Rest Ihres Dokuments nicht verändert.

Antwort2

Tatsächlich kann man und verwenden \questionshook, um Formatierungsänderungen zu handhaben.\partshook\SolutionEmphasis

\documentclass{exam}
\usepackage[utf8]{inputenc}

\title{MWE}
\author{John Doe}
\date{November 2020}

%print solutions by default (for MWE's sake)
\printanswers
% do not put a box/frame around printed solutions
\unframedsolutions

\renewcommand\questionshook{\large\bfseries}
\renewcommand\partshook{\normalsize\normalfont}
\SolutionEmphasis{\normalsize\normalfont}

\begin{document}

\maketitle

\begin{questions}
     \question %\begingroup ... \endgroup not needed
     My large and bold question:
     \begin{parts}
         \part First part
         \part Second part
     \end{parts}
    
    \begin{solution}
    My general solution prerequisite.
    \begin{parts}
        \part My first part solution
        \part My second part solution
    \end{parts}
    \end{solution}
\end{questions}

\end{document}

Antwort3

Die einfachste Möglichkeit, eine Umgebung zu erstellen, ist die Verwendung von \newenvironment{<name>}{<begin code>}{<end code>}. In Ihrem Fall wäre das also einfach: \newenvironment{\lquestion}{\large\bfseries\question}{}Sie können dem Anfangs- oder Endcode alles hinzufügen, was Sie möchten. Der Anfangscode ist das, was am \begin{lquestion}Tag passiert, und der Endcode ist das, was am \end{lquestion}Tag passiert. Es gibt natürlich fortgeschrittenere Möglichkeiten, dies zu tun, aber dies ist die einfachste Methode und in diesem Fall ist nichts Komplexeres erforderlich.

verwandte Informationen