Заключите в скобки математическое выражение, если оно содержит оператор

Заключите в скобки математическое выражение, если оно содержит оператор

Представьте, что я написал несколько дробей формы $\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, но с использованием xstringpackage.

\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}

введите описание изображения здесь

PS: Я предлагаю решение Стивена, так как его проще расширить для большего количества случаев, но я уже создал этот код до того, как увидел его ответ, и поэтому опубликовал его.

Связанный контент