Clase de examen: la mejor manera de redefinir el comando \question para aplicar formato personalizado

Clase de examen: la mejor manera de redefinir el comando \question para aplicar formato personalizado

EDITAR: En resumen, la respuesta realmente resultó elegante y sencilla. ¡Gracias a todas las respuestas a continuación!

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

En breve, quiero generar una clase de documento de hoja de examen personalizada basada en elexamclasepara utilizar en un grupo de compañeros. Para ello, quiero redefinir el \questioncomando predeterminado para aplicar algún formato personalizado.

Supongamos que quiero que la \questionsección predeterminada sea grande y en negrita. Lo que estoy haciendo ahora es lo siguiente:

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

Entonces, para poder usar mi formato personalizado, tengo que escribir lo siguiente en mis documentos:

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

(He leído que usar comandos como entornos está bien en LaTeX, pero corrígeme si eso esconde algunas piedras submarinas).

¿Cuál sería la mejor manera de redefinir el questioncomando, que proviene de exam.cls, como un entorno para no tener que anteponer esa bonificación lal principio del entorno y poder usar el nombre contenido predeterminado questionen su lugar?

EDITAR: Un ejemplo de trabajo mínimo:

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

La \questiondefinición de se puede encontrar en la línea 2845 enexam.clsdentro del questionsambiente:


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

¡Gracias de antemano!

Respuesta1

Parece que ya has descubierto que puedes usar un comando como entorno, por lo que tu pregunta es realmente "¿cómo puedo redefinir el questioncomando para que tenga \large\bfseriesal principio?". El problema que has descubierto es que el questionsentorno define el \questioncomando. En cuyo caso, creo que su ejemplo funciona con

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

No estoy contento con la necesidad de tenerlo \printanswersallí, pero de lo contrario las soluciones desaparecen. Por lo tanto, es posible que tengas que realizar un seguimiento de dos \printanswerscomandos diferentes.

En cuanto a la pregunta sobre el entorno: \begin{myenv}...\end{myenv}se convierte en \begingroup\myenv ...\endmyenv\endgroup(donde \endmyenvno provocará un error si no existe). El resultado es que agrupa automáticamente su documento \large\bfseriespara que no altere el resto de su documento.

Respuesta2

En realidad, se pueden usar \questionshooky para manejar cambios de formato \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}

Respuesta3

La forma más básica de crear un entorno es utilizar \newenvironment{<name>}{<begin code>}{<end code>}. Entonces, en su caso, esto sería simplemente. \newenvironment{\lquestion}{\large\bfseries\question}{}Puede agregar cualquier otra cosa que desee al código inicial o final. El código inicial es lo que sucede en \begin{lquestion}la etiqueta y el código final es lo que sucede en la \end{lquestion}etiqueta. Por supuesto, hay formas más avanzadas de hacer esto, pero este es el método más simple y no hay necesidad de algo más complejo en este caso.

información relacionada