考试类:重新定义 \question 命令以应用自定义格式的最佳方法

考试类:重新定义 \question 命令以应用自定义格式的最佳方法

编辑:总而言之,答案确实优雅而简单。感谢以下所有答案!

\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}。当然,还有更高级的方法可以做到这一点,但这是最简单的方法,在这种情况下不需要更复杂的东西。

相关内容