
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 noexam
aulapara usar em um grupo de colegas. Para esse efeito, desejo redefinir o \question
comando padrão para aplicar alguma formatação personalizada.
Suponha que eu queira tornar a \question
seçã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 question
comando, que vem de exam.cls
, como um ambiente para que eu não precise acrescentar esse bônus l
no 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 \question
definição do pode ser encontrada na linha 2845 emexam.cls
dentro do questions
ambiente:
\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 question
comando para que tenha \large\bfseries
no início". O problema que você descobriu é que o questions
ambiente define o \question
comando. Nesse caso, acho que seu exemplo funciona com
\usepackage{etoolbox}
\appto{\questions}{%
\preto{\question}{\large\bfseries}%
\printanswers%
}
Não estou feliz em precisar estar \printanswers
lá, mas caso contrário as soluções desaparecem. Portanto, você pode precisar acompanhar dois \printanswers
comandos diferentes.
Quanto à questão do ambiente: \begin{myenv}...\end{myenv}
torna-se \begingroup\myenv ...\endmyenv\endgroup
, (onde \endmyenv
não causará erro se não existir). O resultado é que você agrupa automaticamente seus arquivos \large\bfseries
para que não alterem o restante do documento.
Responder2
Na verdade, pode-se usar e \questionshook
para 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.