Expresión matemática entre paréntesis si contiene operador

Expresión matemática entre paréntesis si contiene operador

Imagine que he escrito varias fracciones del formulario $\frac{V+W}{U}$y luego decido que quiero que se muestren como una fracción con barra diagonal. En el grupo donde quiero que esto suceda, siempre puedo hacerlo \renewcommand\frac[2]{#1/#2}. Sin embargo, me gustaría agregar paréntesis al numerador (o al denominador).sólo sicontiene un mathop. Al menos, esta me parece una primera heurística adecuada para decidir si el numerador (denominador) debe estar entre paréntesis o no.

¿Alguien sabe como lograr esto?

Respuesta1

Aquí busco +, -, \bullety \cdot, pero puedes agregar más operadores a la \setsepcharlista.

Además, si el operador es el principal, como por ejemplo -3, no agrego pares. Podrías cambiar eso comentando la línea \ignoreemptyitems.

EDITADO para solucionar un error extraño cuando \simaparece solo como argumento de \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}

ingrese la descripción de la imagen aquí

Respuesta2

Propongo un \ifraccomando. Si se le da, *llamará \inlinefrac, pero también obedecerá la configuración realizada por \fractionsinline(configuración local).

De esta manera, es fácil cambiar de un formulario a otro, agregando o eliminando archivos *. También puedes usarlo \inlinefracdirectamente.

Los símbolos que activan los paréntesis no tienen por qué ser los mismos en el numerador y el denominador: los símbolos de multiplicación deben activar paréntesis solo en el denominador.

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

ingrese la descripción de la imagen aquí

Respuesta3

Una alternativa con la misma idea que la solución de @Steven pero usando xstringel paquete.

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

ingrese la descripción de la imagen aquí

PD: Sugiero que la solución de Steven sea más fácil de expandir para más casos, pero ya había creado este código antes de ver su respuesta y, por lo tanto, publicarlo.

información relacionada