问题
如何在内联分数的分子和分母中应用选择性字距调整?具体来说,我想要:
- 如果分子末尾有 7,则收紧分子后的字距
- 如果分子末尾有 4,则放松分子后的字距
- 如果分母以 4 开头,则在分母前收紧字距
- 如果分母以 5 或 7 开头,则放松分母前的字距调整
背景
我对文本段落中的分数排版不太满意,因此我一直在研究一个名为的宏\sfrac
。到目前为止,我对结果很满意,除了上面提到的字距调整。\nicefrac
\textfrac
特点\textfrac
:
- 分子和分母使用 5 点字体,而不是 7 点字体。
- 在计算机现代和拉丁现代中,与标准数字的高度和深度完美对齐。
\textit
在和内部运行良好\textbf
。(除了稍后提到的小问题。)- 以整数作为可选参数。如果存在,它会在整数和分数之间添加微字距调整 — 例如 2½ 变成 2 ½。还会在整数和分数之间添加斜体校正。
\futurelet
如果分数后面没有空格(例如句号或逗号),则使用前瞻方法在分数后面添加额外的空格。但是,这种方法的实现还不够准确,因为如果下一个标记是}
空格,则无法检测到空格标记。- 星号版本使用水平线而不是对角斜线来排版分数。
以下是三种流行分数样式的比较:
段落形式中的相同比较:
附加问题
如何修复,使得在和\textfrac*
内部使用时分母和水平线向左移动?\textsl
\textit
近距离观察:
最小工作示例
\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}%
}