¿Cómo convertir todas las fracciones de la forma m/n a la forma\dfrac{m}{n}?

¿Cómo convertir todas las fracciones de la forma m/n a la forma\dfrac{m}{n}?

Mi documento tiene muchas fracciones del formulario m/n. Ahora quiero convertir todas las fracciones de la forma m/n a la forma \dfrac{m}{n}.ingrese la descripción de la imagen aquí No puedo encontrar una manera de convertir. La forma única es a mano.

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ m/n + p/q = 2/3. \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

Respuesta1

Aquí hay una solución basada en LuaLaTeX. Si se ve obligado a utilizar pdfLaTeX, es posible que no tenga suerte. Sin embargo, es de esperar que la respuesta siga siendo útil para otros lectores.

Un problema importante con la notación de fracciones infijas, como a/by 1/2, es que cuando TeX tiene la oportunidad de notar la presencia de un /símbolo en el flujo de entrada, el material que se supone que forma el numerador ya ha desaparecido; retroceder para recuperar el numerador sería muy tedioso (o tal vez incluso imposible). Un enfoque basado en preprocesadores parece más prometedor. Afortunadamente, LuaTeX proporciona process_input_bufferdevolución de llamada, que es muy adecuada para el preprocesamiento.

El siguiente código de ejemplo proporciona una función Lua que realiza la conversión de infijo a dfrac. El único requisito sintáctico es que los caracteres del numerador y los denominadores estén formados únicamente por caracteres alfabéticos y números arábigos. (No se permiten paréntesis) /Se permiten espacios en blanco inmediatamente a la izquierda o derecha del símbolo (barra diagonal).

Dado el reemplazo de /with \dfrac, esta función Lua deberíanuncaejecutarse en material en modo matemático en línea, y mucho menos en material en modo texto, para que no cause estragos en ningún /personaje. Por lo tanto, el código también proporciona dos macros LaTeX ( \ReplaceOny \ReplaceOff) que activan y desactivan la función Lua. Le sugiero que inserte una \ReplaceOndirectiva al comienzo de cada grupo de ecuaciones que contengan fracciones infijas y una \ReplaceOffdirectiva al final de cada grupo.

ingrese la descripción de la imagen aquí

% !TEX TS-program = lualatex
\documentclass{article}

%% Lua-side code
\usepackage{luacode}
\begin{luacode*}
function sltodf ( s ) -- "slash to dfrac"
  return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\dfrac{%1}{%2}" ) )
end
\end{luacode*}
%% TeX-side code
\newcommand\ReplaceOn{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltodf, "sltodf" )}}
\newcommand\ReplaceOff{\directlua{luatexbase.remove_from_callback (
    "process_input_buffer", "sltodf" )}}

\usepackage{amsmath} % for '\dfrac' macro

\begin{document}
\ReplaceOn
\[ m /n + pq / rs = 1 / 2 - 21/ 32 . \]  % lots of whitespace

\[m/n+pq/rs=1/2-21/32.\] % no whitespace at all

\[ 2a /3b + pq/rs = a / 5 - 61c/41d . \] % mixtures of letters and numerals

\ReplaceOff  % no more infix to frac processing

\[ m /n + pq/rs = 1 / 2 - 21/32 . \]
\end{document}


Apéndice: Para extender el alcance de la función Lua a todo el documento automáticamente, es necesario realizar algunas pruebas para verificar si estamos en un entorno de visualización matemática y realizar la conversión de infijo a frac solo si ese es el caso. Cómo hacer esto se muestra en el siguiente ejemplo. Se reconocen automáticamente seis entornos matemáticos de visualización (además de los comandos \[y "LaTeX básicos" \]): equation, align, alignat, flalign, gathery multline. Se manejan tanto la variante "protagonizada" como la "normal" de estos entornos.

Los requisitos con respecto a la sintaxis de entrada son bastante leves. Se permiten expresiones con \[ ... \], al igual que todos los entornos matemáticos de visualización en los que las declaraciones de apertura y cierre, como \begin{equation}o \end{align}, están en línea por sí mismas.

El siguiente código también proporciona las macros \ReplaceOffy \ReplaceOn, ya que puede ser necesario suspender la operación de la función Lua "a mano", por ejemplo, en el caso de un verbatimmaterial similar que contenga código displaymath.

ingrese la descripción de la imagen aquí

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath} % for various displayed-equation environments

%% Lua-side code
\usepackage{luacode}
\begin{luacode*}
in_dispmath = false  -- set up a Boolean variable
function sltofr ( s ) -- "slash to frac" 
   -- if we find a '\[ ... \]' line, perform infix fraction replacements
   if string.find ( s , "\\%[.*\\%]" ) then
      return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\frac{%1}{%2}" ) )

   -- switch 'in_dispmath' to 'true' if at start of a displaymath env.
   elseif string.find ( s , "\\begin{equation%*?}" ) or
          string.find ( s , "\\begin{align%*?}" ) or
          string.find ( s , "\\begin{alignat%*?}" ) or
          string.find ( s , "\\begin{flalign%*?}" ) or
          string.find ( s , "\\begin{gather%*?}" ) or
          string.find ( s , "\\begin{multline%*?}" ) or
          string.find ( s , "\\%[" ) then
      in_dispmath = true

   -- switch 'in_dispmath' back to 'false' if at end of a displaymath env.
   elseif string.find ( s , "\\end{equation%*?}" ) or
          string.find ( s , "\\end{align%*?}" ) or
          string.find ( s , "\\end{alignat%*?}" ) or
          string.find ( s , "\\end{flalign%*?}" ) or
          string.find ( s , "\\end{gather%*?}" ) or
          string.find ( s , "\\end{multline%*?}" ) or
          string.find ( s , "\\%]" ) then
      in_dispmath = false

   -- if in displaymath mode, replace infix fractions with \frac expressions
   elseif in_dispmath == true then
      return ( string.gsub ( s , "(%w+)%s-/%s-(%w+)" , "\\frac{%1}{%2}" ) )
   end
end
\end{luacode*}

%% TeX-side code
% Assign the Lua function to the 'process_input_buffer' callback 
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltofr, "sltofr" )}}

% Macros to enable and disable the Lua function "by hand";
% this may be needed if the document contains verbatim sections
%   that feature displaymath-mode code
\newcommand\ReplaceOn{\directlua{luatexbase.add_to_callback (
    "process_input_buffer", sltofr, "sltofr" )}}
\newcommand\ReplaceOff{\directlua{luatexbase.remove_from_callback (
    "process_input_buffer", "sltofr" )}}

\begin{document}
\[ 2m /3n + pq / rs = 1 / 2 - 33/ 55 . \]

\[
2m/3n+pq/rs=1/2-33/55.
\] 

\[1/2+1/2=1\]\[1/3+1/3+1/3=1\]
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}

When not in display math mode, no processing: ``and/or'', $a/b$, $1/2$

\ReplaceOff  % get ready for some verbatim material
\begin{verbatim}
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}
\end{verbatim}

\ReplaceOn % back to 'normal' (replacement) mode
\begin{align*} 
1/2+1/2         &=1\\ 
1/3+1/3 + 1 / 3 &= 1
\end{align*}
\end{document}

Respuesta2

Si el archivo proporcionado se guarda comof.tex

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ m/n + p/q = 2/3 . \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

entonces

sed -e "s@ \([a-zA-Z0-9]\+\)/\([a-zA-Z0-9]\+\) @ \\\\dfrac{\\1}{\\2} @g"  f1.tex  > f2.tex 

Producirá

 \documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
\[ \dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3} . \]
I want 
\[\dfrac{m}{n} + \dfrac{p}{q} = \dfrac{2}{3}.\]
\end{document}

sedestá disponible de forma predeterminada en sistemas tipo Unix (linux, macos, cygwin...) y está disponible en muchos lugares para Windows.

El mismo reemplazo de expresión regular también se podría realizar en cualquier editor de texto si no se desea la línea de comando sed.

información relacionada