Aula de exame: melhor maneira de redefinir o comando \question para aplicar formatação personalizada

Aula de exame: melhor maneira de redefinir o comando \question para aplicar formatação personalizada

EDIT: Em resumo, a resposta realmente ficou elegante e simples. Obrigado a todas as respostas abaixo!

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

Em breve, quero gerar uma classe de documento de planilha de exame personalizada com base noexamaulapara usar em um grupo de colegas. Para esse efeito, desejo redefinir o \questioncomando padrão para aplicar alguma formatação personalizada.

Suponha que eu queira tornar a \questionseção padrão grande e em negrito. O que estou fazendo agora é o seguinte:

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

Portanto, para usar minha formatação personalizada, preciso escrever o seguinte em meus documentos:

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

(Eu li que usar comandos como ambientes é aceitável no LaTeX, mas corrija-me se isso esconder algumas pedras subaquáticas.)

Qual seria a melhor maneira de redefinir o questioncomando, que vem de exam.cls, como um ambiente para que eu não precise acrescentar esse bônus lno início do ambiente e possa usar o nome contido padrão question?

EDIT: Um exemplo mínimo de trabalho:

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

A \questiondefinição do pode ser encontrada na linha 2845 emexam.clsdentro do 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}

Desde já, obrigado!

Responder1

Parece que você já descobriu que pode usar um comando como ambiente, então sua pergunta é realmente "como posso redefinir o questioncomando para que tenha \large\bfseriesno início". O problema que você descobriu é que o questionsambiente define o \questioncomando. Nesse caso, acho que seu exemplo funciona com

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

Não estou feliz em precisar estar \printanswerslá, mas caso contrário as soluções desaparecem. Portanto, você pode precisar acompanhar dois \printanswerscomandos diferentes.

Quanto à questão do ambiente: \begin{myenv}...\end{myenv}torna-se \begingroup\myenv ...\endmyenv\endgroup, (onde \endmyenvnão causará erro se não existir). O resultado é que você agrupa automaticamente seus arquivos \large\bfseriespara que não alterem o restante do documento.

Responder2

Na verdade, pode-se usar e \questionshookpara lidar com alterações de formatação.\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}

Responder3

A maneira mais básica de criar um ambiente é usando \newenvironment{<name>}{<begin code>}{<end code>}. Então, no seu caso, isso seria apenas: \newenvironment{\lquestion}{\large\bfseries\question}{}Você pode adicionar qualquer outra coisa que desejar no código inicial ou final. O código inicial é o que acontece na \begin{lquestion}tag e o código final é o que acontece na \end{lquestion}tag. Existem maneiras mais avançadas de fazer isso, é claro, mas este é o método mais simples e não há necessidade de algo mais complexo neste caso.

informação relacionada