
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 demexam
Klassezur Verwendung in einer Gruppe von Kollegen. Zu diesem Zweck möchte ich den Standardbefehl neu definieren, \question
um 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.cls
als Umgebung neu zu definieren, sodass ich diesen Bonus nicht l
am Anfang der Umgebung voranstellen muss und question
stattdessen 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 \question
Definition von findet sich in Zeile 2845 inexam.cls
innerhalb der questions
Umgebung:
\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 question
Befehl neu definieren, sodass er \large\bfseries
am Anfang steht?“ Das Problem, das Sie entdeckt haben, ist, dass die questions
Umgebung 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 \printanswers
dort haben muss, aber die Lösungen verschwinden sonst. Sie müssen also möglicherweise zwei verschiedene \printanswers
Befehle im Auge behalten.
Zur Frage der Umgebung: \begin{myenv}...\end{myenv}
wird zu \begingroup\myenv ...\endmyenv\endgroup
, (wobei \endmyenv
kein Fehler auftritt, wenn es nicht vorhanden ist). Das Ergebnis ist, dass Sie Ihr automatisch gruppieren, \large\bfseries
sodass 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.