编辑:总而言之,答案确实优雅而简单。感谢以下所有答案!
\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
?
编辑:一个最小的工作示例:
\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}
。当然,还有更高级的方法可以做到这一点,但这是最简单的方法,在这种情况下不需要更复杂的东西。