如何解决考试课堂上的字体问题

如何解决考试课堂上的字体问题

当我在考试课堂上更改字体样式时,我注意到了一些奇怪的事情。使用默认字体 MWE

\documentclass[a4paper,twoside,xetex,12pt]{exam}
 \usepackage{mathspec} 
%\setmainfont{Times New Roman}
 \begin{document} 
\setlength\dottedlinefillheight{1cm}
 \begin{questions}
 \question
Explain what is meant by the term \textbf{mole fraction} \fillwithdottedlines{3cm} 
\end{questions} 
\end{document}

结果是

在此处输入图片描述

现在通过取消注释行 %\setmainfont{Times New Roman} 来更改字体,我得到了这个

在此处输入图片描述

如您所见,答案行从 3 行减少到 2 行,并且双向箭头所示的间隙很大。我真诚地请求社区的帮助,帮我解决这个困境。

答案1

如果我们添加\showoutput,我们会看到当字体是默认字体时,

.....\cleaders 0.0 plus 1.0fill
......\hbox(1.164+0.0)x5.28003, glue set 1.00801fil
.......\glue 0.0 plus 1.0fil minus 1.0fil
.......\TU/lmr/m/n/12 .
.......\glue 0.0 plus 1.0fil minus 1.0fil

指的是 的领导人\dotfill

当使用 Times New Roman 字体时,我们会看到,

.....\cleaders 0.0 plus 1.0fill
......\hbox(1.13672+0.16405)x5.28003, glue set 1.14001fil
.......\glue 0.0 plus 1.0fil minus 1.0fil
.......\TU/TimesNewRoman(0)/m/n/12 .
.......\glue 0.0 plus 1.0fil minus 1.0fil

您看出区别了吗?该框具有深度,而默认的 Latin Modern 字体则没有。差别很小,但这并不允许垂直引线使用三份虚线规则,因为它们会比指定的 3cm 高度超出 0.49215pt。

您可以通过\dotfill使用破坏的句点进行修补来解决此问题。

\documentclass[a4paper,twoside,12pt]{exam}
\usepackage{mathspec}
\usepackage{xpatch}

\setmainfont{Times New Roman}

\xpatchcmd{\dotfill}{\hss.\hss}{\hss\smash{.}\hss}{}{}

\begin{document}

\setlength\dottedlinefillheight{1cm}

\begin{questions}
\question
Explain what is meant by the term \textbf{mole fraction} \fillwithdottedlines{3cm}
\end{questions}

\end{document}

在此处输入图片描述

避免传递文档类选项xetex。它没有任何好处。

\do@fillwithdottedlines您可能会向 的维护者建议一个更好的定义exam.cls

\vrule这个想法是将位替换\vbox为指定的高度,从而消除周期的可能深度。

\def\do@fillwithdottedlines#1{%
  \begingroup
  \ifhmode
    \par
  \fi
  \hrule height \z@
  \nobreak
  \setbox0=\vbox to \dottedlinefillheight{%
    \vss
    \hbox to \hsize{%
      \hskip \@totalleftmargin
      \dotfill
    }%
    \vskip-\prevdepth % kill the depth of the dots
  }%
  % We use \cleaders (rather than \leaders) so that a given
  % vertical space will always produce the same number of lines
  % no matter where on the page it happens to start:
  \cleaders \copy0 \vskip #1 \hbox{}%
  \endgroup
}% \do@fillwithdottedlines

如果您采用此代码,请记住使用\makeatletter和。\makeatother

相关内容