当我在考试课堂上更改字体样式时,我注意到了一些奇怪的事情。使用默认字体 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