是否有可能检测出第二个参数\frac
比第一个参数小得多的情况,并将其拆分?也就是说(我使用一个新的宏名\wfrac
来简化事情),
\wfrac{x}{2} % => \frac{x}{2}
\wfrac{x+y}{2} % => \frac{1}{2}\left(x+y\right)
\wfrac{\sum_{i=1}^{N} i^3}{x+y+z+t}
% => \frac{1}{x+y+z+t} \left(\sum_{i=1}^{N} i^3\right)
% => or \left(\sum_{i=1}^{N} i^3\right) / \left(x+y+z+t\right)
\wfrac{\sum_{i=1}^{N} i^3}{\sum_{i=1}^{N} i}
% => \frac{...}{...} (unchanged)
请随意告诉我这是一个坏主意。
编辑:正如 David 在他的评论中指出的那样,我对更大/更小的定义并不明确。第三个例子特别体现了分子更高但分母更宽的情况。他还指出,可能\wfrac{x}{y}
会变成(x)/(y)
。我在写问题时正在构建要求,因此请随意调整它们。
\wfrac{x}{y}
\frac{x}{y}
应成为、 或\frac{1}{y}(x)
或之一(x)/(y)
,并()/
根据需要缩放。以下是一种可以产生良好结果的方案。表示hx
,和hy
的高度(加上深度);,它们的宽度;以及可自定义的阈值,用于表示“小”,例如公式 的尺寸,但阈值可能应该取决于。x
y
wx
wy
h0
w0
$a+b$
\mathstyle
如果
hy < h0
和wy < w0
,- 如果
hx < h0
和wx < max(w0, 2 * wy)
,则使用\frac{x}{y}
。 - 否则使用
\frac{1}{y}(x)
。
- 如果
否则使用
(x)/(y)
。
答案1
我觉得这是一个有趣的问题,所以我尝试了一下。
让我先看看结果:
main.tex
:
\documentclass{article}
\usepackage{wfrac}
\begin{document}
\setmaxeq{a+b} % Reference equation for size
\[ \wfrac{x}{2} \]
\[ \wfrac{x+y}{2} \]
\[ \wfrac{\sum_{i=1}^{N} i^3}{x+y+z+t} \]
\[ \wfrac{\sum_{i=1}^{N} i^3}{\sum_{i=1}^{N} i} \]
\setmax{34pt}{10pt} % Manual maximum size
\[ \wfrac{\sum_{i=1}^{N} i^3}{\sum_{i=1}^{N} i} \]
\setmaxeq{x} % Reference equation again
\[ \wfrac{x}{x} \]
\[ \efrac{x}{x} \]
\end{document}
它看起来像这样:
选项:
text
:与中的方程进行比较\textstyle
。display
:与中的方程进行比较\displaystyle
。none
:与当前活动样式中的方程进行比较。noparen
:没有括号small
:小的最大高度和宽度big
:最大高度和宽度huge
:最大高度和宽度巨大lparen
:设置左括号,例如:lparen=\left[
rparen
:设置右括号,例如:rparen={\right]}
div
:设置分割标记,例如:div=\div
命令
\wfrac
:遵循“少”规则的分数。\efrac
:遵循“小于或等于”规则的分数。\setmax
:设置最大尺寸。\setmaxeq
:使用参考方程设置最大尺寸。\getmax
:获取最大尺寸。\getsize
:通过方程式获取尺寸。\setparen
:设置括号,接受两个参数。\setdiv
:设置分割标记。
下面是wfrac.sty
:
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{wfrac}[2012/11/03 v1.01 intelligent fractions]
% Lengths and widths
\newdimen \wfrac@hx
\newdimen \wfrac@hy
\newdimen \wfrac@hmax
\newdimen \wfrac@wx
\newdimen \wfrac@wy
\newdimen \wfrac@wmax
\newdimen \wfrac@wmaxcalc
% Parenthesis and division mark
\newcommand*{\wfrac@lparen}{\left(}
\newcommand*{\wfrac@rparen}{\right)}
\newcommand*{\wfrac@div}{\middle/}
% Options
\IfFileExists{xkeyval.sty}{
\RequirePackage{xkeyval}
\DeclareOptionX{lparen}{\renewcommand*{\wfrac@lparen}{##1}}
\DeclareOptionX{rparen}{\renewcommand*{\wfrac@rparen}{##1}}
\DeclareOptionX{div}{\renewcommand*{\wfrac@div}{##1}}
}{
\let\DeclareOptionX\DeclareOption
\let\ExecuteOptionsX\ExecuteOptions
\let\ProcessOptionsX\ProcessOptions
}
\DeclareOptionX{text}{\edef\wfrac@style{\textstyle}}
\DeclareOptionX{display}{\edef\wfrac@style{\displaystyle}}
\DeclareOptionX{none}{\edef\wfrac@style{}}
\DeclareOptionX{noparen}{\renewcommand*{\wfrac@lparen}{}\renewcommand*{\wfrac@rparen}{}}
\DeclareOptionX{small}{\wfrac@wmax = 25pt \wfrac@hmax = 10pt}
\DeclareOptionX{big}{\wfrac@wmax = 50pt \wfrac@hmax = 50pt}
\DeclareOptionX{huge}{\wfrac@wmax = 100pt \wfrac@hmax = 100pt}
\ExecuteOptionsX{text,small}
\ProcessOptionsX\relax
% Fraction variations
\newcommand*{\wfrac@Afrac}[2]{\left. \wfrac@lparen #1 \wfrac@rparen \wfrac@div \wfrac@lparen #2 \wfrac@rparen \right.}
\newcommand*{\wfrac@Bfrac}[2]{\frac{1}{#2}\wfrac@lparen #1 \wfrac@rparen}
\newcommand*{\wfrac@Cfrac}[2]{\frac{#1}{#2}}
% Main commands
\newcommand*\setparen[2]{
\renewcommand*{\wfrac@lparen}{#1}
\renewcommand*{\wfrac@rparen}{#2}
}
\newcommand*\setdiv[1]{
\renewcommand*{\wfrac@div}{#1}
}
\newcommand*\setmax[2]{
\wfrac@wmax = #1
\wfrac@hmax = #2
}
\newcommand*\setmaxeq[1]{
\settowidth{\wfrac@wmax}{$ \wfrac@style #1 $}
\settoheight{\wfrac@hmax}{$ \wfrac@style #1 $}
}
\newcommand*\getmax{
\the\wfrac@wmax $\times$ \the\wfrac@hmax
}
\newcommand*\getsize[1]{
\settowidth{\wfrac@wx}{$ \wfrac@style #1 $}
\settoheight{\wfrac@hx}{$ \wfrac@style #1 $}
\the\wfrac@wx $\times$ \the\wfrac@hx
}
\newcommand*\wfrac[2]{
\settowidth{\wfrac@wx}{$ \wfrac@style #1 $}
\settowidth{\wfrac@wy}{$ \wfrac@style #2 $}
\settoheight{\wfrac@hx}{$ \wfrac@style #1 $}
\settoheight{\wfrac@hy}{$ \wfrac@style #2 $}
% max(w0, 2 * wy)
\ifdim \wfrac@wmax < 2\wfrac@wy
\wfrac@wmaxcalc = 2\wfrac@wy
\else
\wfrac@wmaxcalc = \wfrac@wmax
\fi
%
\ifdim \wfrac@hy < \wfrac@hmax
\ifdim \wfrac@wy < \wfrac@wmax
\ifdim \wfrac@hx < \wfrac@hmax
\ifdim \wfrac@wx < \wfrac@wmaxcalc
\let\wfrac@frac=\wfrac@Cfrac
\else
\let\wfrac@frac=\wfrac@Bfrac
\fi
\else
\let\wfrac@frac=\wfrac@Bfrac
\fi
\else
\let\wfrac@frac=\wfrac@Afrac
\fi
\else
\let\wfrac@frac=\wfrac@Afrac
\fi
%
\wfrac@frac{#1}{#2}
}
\newcommand*\efrac[2]{
\settowidth{\wfrac@wx}{$ \wfrac@style #1 $}
\settowidth{\wfrac@wy}{$ \wfrac@style #2 $}
\settoheight{\wfrac@hx}{$ \wfrac@style #1 $}
\settoheight{\wfrac@hy}{$ \wfrac@style #2 $}
% max(w0, 2 * wy)
\ifdim \wfrac@wmax < 2\wfrac@wy
\wfrac@wmaxcalc = 2\wfrac@wy
\else
\wfrac@wmaxcalc = \wfrac@wmax
\fi
%
\ifdim \wfrac@hy > \wfrac@hmax
\let\wfrac@frac=\wfrac@Afrac
\else
\ifdim \wfrac@wy > \wfrac@wmax
\let\wfrac@frac=\wfrac@Afrac
\else
\ifdim \wfrac@hx > \wfrac@hmax
\let\wfrac@frac=\wfrac@Bfrac
\else
\ifdim \wfrac@wx > \wfrac@wmaxcalc
\let\wfrac@frac=\wfrac@Bfrac
\else
\let\wfrac@frac=\wfrac@Cfrac
\fi
\fi
\fi
\fi
%
\wfrac@frac{#1}{#2}
}
\endinput