根据分子/分母大小差异重新格式化 \frac

根据分子/分母大小差异重新格式化 \frac

是否有可能检测出第二个参数\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的高度(加上深度);,它们的宽度;以及可自定义的阈值,用于表示“小”,例如公式 的尺寸,但阈值可能应该取决于。xywxwyh0w0$a+b$\mathstyle

  1. 如果hy < h0wy < w0

    1. 如果hx < h0wx < max(w0, 2 * wy),则使用\frac{x}{y}
    2. 否则使用\frac{1}{y}(x)
  2. 否则使用(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

命令

  1. \wfrac:遵循“少”规则的分数。
  2. \efrac:遵循“小于或等于”规则的分数。
  3. \setmax:设置最大尺寸。
  4. \setmaxeq:使用参考方程设置最大尺寸。
  5. \getmax:获取最大尺寸。
  6. \getsize:通过方程式获取尺寸。
  7. \setparen:设置括号,接受两个参数。
  8. \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

相关内容