改进了分数的字距调整?

改进了分数的字距调整?

问题

如何在内联分数的分子和分母中应用选择性字距调整?具体来说,我想要:

  • 如果分子末尾有 7,则收紧分子后的字距
  • 如果分子末尾有 4,则放松分子后的字距
  • 如果分母以 4 开头,则在分母前收紧字距
  • 如果分母以 5 或 7 开头,则放松分母前的字距调整

背景

我对文本段落中的分数排版不太满意,因此我一直在研究一个名为的宏\sfrac。到目前为止,我对结果很满意,除了上面提到的字距调整。\nicefrac\textfrac

特点\textfrac

  • 分子和分母使用 5 点字体,而不是 7 点字体。
  • 在计算机现代和拉丁现代中,与标准数字的高度和深度完美对齐。
  • \textit在和内部运行良好\textbf。(除了稍后提到的小问题。)
  • 以整数作为可选参数。如果存在,它会在整数和分数之间添加微字距调整 — 例如 2½ 变成 2 ½。还会在整数和分数之间添加斜体校正。
  • \futurelet如果分数后面没有空格(例如句号或逗号),则使用前瞻方法在分数后面添加额外的空格。但是,这种方法的实现还不够准确,因为如果下一个标记是}空格,则无法检测到空格标记。
  • 星号版本使用水平线而不是对角斜线来排版分数。

以下是三种流行分数样式的比较:

桌子

段落形式中的相同比较:

段落

附加问题

如何修复,使得在和\textfrac*内部使用时分母和水平线向左移动?\textsl\textit

rm 缝隙 bf

近距离观察:

想

最小工作示例

\documentclass{article}
\usepackage{ifthen}    % for use in \textfrac

\makeatletter

% Add a hair space if the fraction is followed by a non-space token.
\newcommand{\textfrac@kern}{%
  \ifx\textfrac@nexttoken\@sptoken%
    %
  \else%
    \kern.08333em%
  \fi%
}

% The non-star version of \textfrac uses a diagonal solidus.
\newcommand{\textfrac@nostar}[3][]{%
  \mbox{%
    \ifthenelse{\not\equal{#1}{}}%  Test for integer portion [optional #1]
      {#1\/\kern.05em}%                 Present? Emit integer and hair space
      {}%                             Not present? Emit nothing
    \raisebox{.775ex}{\tiny #2}%    Emit numerator [#2]
    \raisebox{.365ex}{\kern-.15em{\scriptsize /}\kern-.15em}%  Emit solidus
    \raisebox{0ex}{\tiny #3}%       Emit denominator [#3]
  }%
  \futurelet\textfrac@nexttoken\textfrac@kern%
}

% The star version of \textfrac uses a horizontal rule.
\newlength\textfrac@width@num%
\newlength\textfrac@width@denom%
\newlength\textfrac@width@%
\newcommand{\textfrac@star}[3][]{%
  \settowidth{\textfrac@width@num}{\tiny #2\/}%
  \settowidth{\textfrac@width@denom}{\tiny #3\/}%
  \ifthenelse{\lengthtest{\textfrac@width@num<\textfrac@width@denom}}%
    {\let\textfrac@width@\textfrac@width@denom}%
    {\let\textfrac@width@\textfrac@width@num}%
  \mbox{%
    \ifthenelse{\not\equal{#1}{}}%  Test for integer portion [optional #1]
      {#1\/\kern.08333em}%              Present? Emit integer and hair space
      {}%                             Not present? Emit nothing
    \ooalign{%
      \relax\cr%
      \noalign{\vskip-1.1ex}%
      {\hss\tiny #2\/\hss}\cr%        Emit numerator [#2]
      \noalign{\vskip1.1ex}%
      \rule[.6666ex]{\textfrac@width@}{.4pt}\cr%   Emit horizontal rule
      \noalign{\vskip.4ex}%
      {\hss\tiny #3\/\hss}\cr%        Emit denominator [#3]
      \noalign{\vskip-.4ex}%
    }%
  }%
  \let\textfrac@width\undefined%
  \futurelet\textfrac@nexttoken\textfrac@kern%
}

% Select between \textfrac and \textfrac*.
\def\textfrac{\@ifstar\textfrac@star\textfrac@nostar}

\makeatother

\begin{document}

\noindent\textrm{\textfrac[2]{1}{2} cups\quad \textfrac*[2]{1}{2} cups\\}
\noindent\textit{\textfrac[2]{1}{2} cups\quad \textfrac*[2]{1}{2} cups\\}

\end{document}

答案1

在斜体上下文中移动分子的一种方法是

 {\hss\tiny\kern\fontdimen\@ne\font#2\/\kern-\fontdimen\@ne\font\hss}\cr%        Emit numerator [#2]

至于向前看并添加空格的安全方法,您可能需要查看 latex 的定义,\DeclareTextFontCommand其中定义\textit和朋友在开始或结束时添加斜体校正,具体取决于。

答案2

这是我使用 的版本fontspec,适用于 Cambria 之类的字体。

\newcommand{\textfrac}[2]{%
  {\addfontfeature{VerticalPosition=Numerator}#1}%
  \divslash{}%
  {\addfontfeature{VerticalPosition=Denominator}#2}%
}

相关内容