
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}
теге. Конечно, есть более продвинутые способы сделать это, но это самый простой метод, и в этом случае нет необходимости в чем-то более сложном.