Экзаменационный класс: лучший способ переопределить команду \question для применения пользовательского форматирования

Экзаменационный класс: лучший способ переопределить команду \question для применения пользовательского форматирования

EDIT: В целом ответ получился действительно элегантным и простым. Спасибо всем за ответы ниже!

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

Короче говоря, я хочу создать пользовательский класс документов экзаменационного листа на основеexamсортдля использования в группе коллег. Для этой цели я хочу переопределить \questionкоманду по умолчанию, чтобы применить некоторое пользовательское форматирование.

Предположим, я хочу сделать \questionраздел по умолчанию большим и жирным. Сейчас я делаю следующее:

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

Поэтому, чтобы использовать свое пользовательское форматирование, мне придется написать в своих документах следующее:

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

(Я читал, что использование команд в качестве окружений в LaTeX допустимо, но поправьте меня, если это скрывает какие-то подводные камни.)

Каков наилучший способ переопределить questionкоманду, которая поступает из exam.cls, как среду, чтобы мне не приходилось добавлять этот бонус lв начало среды и questionвместо этого можно было использовать содержащееся в ней имя по умолчанию?

EDIT: Минимальный рабочий пример:

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

Определение \questionможно найти в строке 2845 вexam.clsвнутри questionsсреды:


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

Заранее спасибо!

решение1

Кажется, вы уже обнаружили, что можете использовать команду как среду, так что ваш вопрос на самом деле "как я могу переопределить команду questionтак, чтобы она имела \large\bfseriesв начале". Проблема, которую вы обнаружили, заключается в том, что questionsсреда определяет \questionкоманду. В этом случае, я думаю, ваш пример работает с

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

Мне не нравится необходимость иметь его \printanswersтам, но решения исчезают в противном случае. Так что вы можете застрять, отслеживая две разные \printanswersкоманды.

Что касается вопроса об окружении: \begin{myenv}...\end{myenv}становится \begingroup\myenv ...\endmyenv\endgroup, (где \endmyenvне будет вызывать ошибку, если его не существует). Результатом является то, что вы автоматически группируете свой \large\bfseriesтак, что он не изменяет остальную часть вашего документа.

решение2

На самом деле, для обработки изменений форматирования можно использовать \questionshook, \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}

решение3

Самый простой способ создания окружения — использовать \newenvironment{<name>}{<begin code>}{<end code>}. Так что в вашем случае это будет просто \newenvironment{\lquestion}{\large\bfseries\question}{}Вы можете добавить все, что захотите, в начальный или конечный код. Начальный код — это то, что происходит в \begin{lquestion}теге, а конечный код — это то, что происходит в \end{lquestion}теге. Конечно, есть более продвинутые способы сделать это, но это самый простой метод, и в этом случае нет необходимости в чем-то более сложном.

Связанный контент