假设我写了几个这样的分数$\frac{V+W}{U}$
,后来决定将它们显示为带斜线的分数。在我想要这样做的组中,我总是可以这样做\renewcommand\frac[2]{#1/#2}
。但是,我想在分子(或分母)上添加括号除非它包含一个mathop
。至少,在我看来,这是决定分子(分母)是否要加括号的合适的第一个启发式方法。
有人知道如何实现这一点吗?
答案1
在这里,我搜索+
、、 和,但您可以将更多运算符添加到-
列表中。\bullet
\cdot
\setsepchar
另外,如果操作符是前导的,例如-3
,我不会添加括号。您可以通过注释该行来更改这一点\ignoreemptyitems
。
\sim
已编辑,以解决当其本身作为参数出现时出现的奇怪错误\inlinefrac
。
\documentclass{article}
\usepackage{listofitems}
\newcommand\inlinefrac[2]{
\setsepchar{+||-||\bullet||\cdot||\oplus}
\ignoreemptyitems
\readlist*\xator{ #1}
\ifnum\listlen\xator[]>1\relax(#1)\else{#1}\fi
/
\readlist*\xator{ #2}
\ifnum\listlen\xator[]>1\relax(#2)\else{#2}\fi
}
\begin{document}
\[
\frac{2}{3}\quad\let\frac\inlinefrac\frac{2}{3}
\]
\[
\frac{2}{-3}\quad\let\frac\inlinefrac\frac{2}{-3}
\]
\[
\frac{2+x}{3}\quad\let\frac\inlinefrac\frac{2+x}{3}
\]
\[
\frac{2\bullet x}{3\cdot y}\quad\inlinefrac{2\bullet x}{3\cdot y}
\]
\centering$\inlinefrac{M\oplus N}{\sim}$
\end{document}
答案2
我提出一个\ifrac
命令。如果给出,*
它将调用,但它也会遵守(本地设置)\inlinefrac
所做的设置。\fractionsinline
这样,通过添加或删除,可以轻松地从一种形式切换到另一种形式*
。您也可以\inlinefrac
直接使用。
触发括号的符号在分子和分母中不必相同:乘法符号应仅在分母中触发括号。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifrac}{smm}
{
\IfBooleanTF { #1 }
{ \inlinefrac { #2 } { #3 } }
{
\bool_if:NTF \l_bubaya_frac_inline_bool
{
\inlinefrac { #2 } { #3 }
}
{
\frac { #2 } { #3 }
}
}
}
\bool_new:N \l_bubaya_frac_inline_bool
% extend the regex at will; \+ and \- stand for + and -,
% \c{command name} for a control sequence
\regex_const:Nn \c_bubaya_frac_num_regex { \+ | \- | \c{sin} | \c{cos} }
\regex_const:Nn \c_bubaya_frac_den_regex { \c{cdot} | \c{times} | \c{bullet} }
\NewDocumentCommand{\fractionsinline}{}
{
\bool_set_true:N \l_bubaya_frac_inline_bool
}
\NewDocumentCommand{\inlinefrac}{mm}
{
\regex_match:NnTF \c_bubaya_frac_num_regex { #1 } { (#1) } { #1 }
/
\regex_match:NnTF \c_bubaya_frac_num_regex { #2 }
{
(#2)
}
{
\regex_match:NnTF \c_bubaya_frac_den_regex { #2 } { (#2) } { #2 }
}
}
\ExplSyntaxOff
\begin{document}
\begin{gather*}
\ifrac{2}{3}\qquad\ifrac*{2}{3}
\\
\ifrac{2}{-3}\qquad\ifrac*{2}{-3}
\\
\fractionsinline
\ifrac{2}{-3}\qquad\ifrac{2}{-3}
\\
\inlinefrac{2+x}{3}
\\
\ifrac{\sin x}{x}\qquad\ifrac*{\sin x}{x}
\\
\end{gather*}
\fractionsinline
\begin{gather*}
\ifrac{2+x}{3}
\\
\ifrac{2\bullet x}{3\cdot y}
\\
\ifrac{\sin x}{x}
\end{gather*}
\end{document}
答案3
另一种方法与@Steven 的解决方案想法相同,但是使用xstring
包。
\documentclass{article}
\usepackage{xstring}
\renewcommand\frac[2]{\IfSubStr{#1}{+}{(#1)}{\IfSubStr{#1}{-}{(#1)}{#1}}/\IfSubStr{#2}{+}{(#2)}{\IfSubStr{#2}{-}{(#2)}{#2}}}
\begin{document}
\(\frac{5}{10}=0.5\) but \(\frac{5+1}{10}=0.6\) and \(\frac{7}{10+4}=0.5\) but \(\frac{14+1}{6+1.5}=2\)
\end{document}
附言:我建议史蒂文的解决方案更容易扩展到更多情况,但在看到他的回答之前已经创建了这个代码,因此发布。