Saltar al contenido

Traducir ecuaciones en línea a código TeX (¿Algún paquete?)

Después de de esta larga búsqueda de datos hemos podido resolver esta inconveniente que pueden tener ciertos los usuarios. Te brindamos la solución y esperamos resultarte de mucha apoyo.

Solución:

Esta es una respuesta inusual, porque, si bien convierte el código del OP en código LaTeX, ese código se almacena de manera que pueda ser leído por la computadora y no por el ojo humano. Por lo tanto, una forma más apropiada de caracterizar esta respuesta es que proporciona un intérprete, escrito en LaTeX, para convertir y presentar ecuaciones proporcionadas en un formato que no es LaTeX. Sin embargo, la actualización más reciente ahora tiene la capacidad de convertir ese código interno en un destokenizado traducción del código LaTeX relevante.

ESTA RESPUESTA HA SIDO MUCHO ACTUALIZADA:

EDITADO para que los operadores matemáticos seleccionados y las letras griegas se puedan analizar sin escapar (por ejemplo, cos x = beta se analiza correctamente). Se pueden agregar más.

EDITADO para que los corchetes [...] se pueden utilizar como caracteres de agrupación no visibles.

Reeditado para convertir automáticamente / dentro frac estilo (gracias a la descripción de David de over en ¿Consecuencias prácticas de usar over frente a frac?).

EDITADO para proporcionar automatización.

EDITADO para proporcionar traducción, así como interpretación interpretativa.

INTERPRETACIÓN DE ECUACIONES

Esta respuesta automatiza el proceso de uso de LaTeX macro para interpretar ecuaciones expresadas en una sintaxis de usuario que no sea LaTeX. Proporciono el LaTeX macro interpreteq en el que se pasa una ecuación sin látex, se analiza en 7 etapas, se reconstituye y se presenta como una ecuación LaTeX.

Lo realmente bueno de este enfoque es que la entrada de la ecuación, en el formato no LaTeX del usuario, se analiza en los “genes” matemáticos que componen una ecuación de acuerdo con el orden de las operaciones. Luego, cada gen se convierte en formato LaTeX y los genes resultantes se reconstituyen automáticamente en una cadena de ADN de código LaTeX ejecutable.

Sin embargo, esa cadena de ADN del código ejecutable se expresa indirectamente en la representación interna de la listofitems package, que se utilizó para dividir matemáticamente la ecuación original que no era LaTeX. Esta representación interna de la ecuación (que es bastante extraña de mirar), se puede mostrar, como prueba del método, por medio de detokenizeexpandafterZ al final de la interpreteq. Esto proporcionará los tokens que realmente se ejecutan para presentar la ecuación en forma LaTeX.

Entonces, por ejemplo, tomemos la ecuación formateada por el usuario (no LaTeX):

x = a_avg + ([x-1] /b_trans)^(-y^[-x])

Esta string de tokens es analizado por el listofitems paquete en el Q list, utilizando la siguiente jerarquía de análisis:

setsepchar[@]

La primera capa de análisis es encontrar instancias de =. Todo el código a la izquierda del = se almacena en Q[1]y todo el código a la derecha de [the 1st] = (y a la izquierda del 2do =) se almacena en Q[2]. El separador en este nivel (es decir, el =) se almacena en Qsep[1].

Para cada pieza, Q[1] y Q[2], se produce el segundo nivel de análisis que busca todas las instancias de (, ), [, and ]. Así por ejemplo, Q[2,3] indica que la hebra de la [non-LaTeX] ADN a la derecha del = y antes de la tercera instancia de los separadores de paréntesis o paréntesis.

Este procedimiento continúa a más de 7 niveles de análisis de acuerdo con un orden de operaciones PEMDAS:

  1. =
  2. (, ), [, and ]
  3. ^
  4. / y *
  5. + y -
  6. _
  7. alpha, beta, pi, cos, sin, tan y otras funciones, según sea necesario

Todo lo que no sea uno de los separadores analizables terminará en un nivel bajo Q[.,.,...] entrada de genes. Sin embargo, todos los separadores analizables terminarán en un Qsep[.,.,...] entrada del gen separador. Y son estos Qsep entradas que requieren conversión en formato LaTeX, y este procedimiento lo lleva a cabo el QS macro:

defQS[#1]%
  if+Qsep[#1]+else%
  if-Qsep[#1]-else%
  if/Qsep[#1]overelse%
  if=Qsep[#1]=else%
  if^Qsep[#1]^else%
  if(Qsep[#1]bgroupleft(else%
  if)Qsep[#1]right)egroupelse%
  if[Qsep[#1]bgroupelse%
  if]Qsep[#1]egroupelse%
  if*Qsep[#1]cdotelse%
  if_Qsep[#1]expandaftertheundelse%
  csname Qsep[#1]endcsnamefififififififififififi%

Luego, el ADN se reconstituye como un string de llamadas a una sucesión indexada de Q[] y QS[] (convertido Qsep[]) genes. Todos aparecen en el orden original cortados. Entonces, por ejemplo, la ecuación de formato de usuario (x = a_avg + ([x-1] /b_trans)^(-y^[-x])), una vez cortado y convertido por interpreteq, se reconstituye como una hebra de ADN mediante la siguiente expresión:

Q [1,1,1,1,1,1,1]QS [1]Q [2,1,1,1,1,1,1]QS [2,1,1,1,1,1]Q [2,1,1,1,1,2,1]QS
[2,1,1,1,1]Q [2,1,1,1,2,1,1]QS [2,1]Q [2,2,1,1,1,1,1]QS [2,2]Q [2,3,1,1,1,1,1]QS
[2,3,1,1,1]Q [2,3,1,1,2,1,1]QS [2,3]Q [2,4,1,1,1,1,1]QS [2,4,1,1]Q [2,4,1,2,1,1,1]QS
[2,4,1,2,1,1]Q [2,4,1,2,1,2,1]QS [2,4]Q [2,5,1,1,1,1,1]QS [2,5,1]Q [2,5,2,1,1,1,1]QS
[2,5]Q [2,6,1,1,1,1,1]QS [2,6,1,1,1]Q [2,6,1,1,2,1,1]QS [2,6,1]Q [2,6,2,1,1,1,1]QS
[2,6]Q [2,7,1,1,1,1,1]QS [2,7,1,1,1]Q [2,7,1,1,2,1,1]QS [2,7]Q [2,8,1,1,1,1,1]QS
[2,8]Q [2,9,1,1,1,1,1]

Y, según los genes que se encuentran en Q y QS, el resultado se parece al deseado, a saber

ingrese la descripción de la imagen aquí

TRADUCIR ECUACIONES

La traducción se logra en macro formulario, translateeq o por medio de un entorno de traducción de ecuaciones separadas por espacios

begintranslateeqs% NO BLANK LINE IS PERMITTED HERE
EQ1

EQ2

...

EQn
endtranslateeqs% NO BLANK LINE IS PERMITTED BEFORE HERE

Esto se logró simplemente redefiniendo temporalmente varios key macros en el proceso y usando [email protected]

para expandir el Q y QS genes en su código LaTeX relevante. Entonces, las ecuaciones resultantes no se representan como antes, sino que se presentan como código LaTeX destokenizado.

En la práctica, las traducciones se pueden realizar en un documento separado, y los resultados se pueden copiar y pegar del PDF resultante en un documento de origen de destino.

EL MWE

Las 5 ecuaciones que verá en el MWE a continuación, tanto interpretadas como traducidas, se ingresan en forma no LaTeX. Los aspectos más destacados del proceso de conversión incluyen el manejo de subíndices de varios caracteres sin agrupar, reconociendo una serie de textuales (no macro) funciones matemáticas y nombres de letras griegas (se pueden agregar más), conversión automática / en fracciones, paréntesis de tamaño automático, conversión * dentro cdot, etc. Aquí están las 5 ecuaciones:

cos(1/s) = f*g

f(x) = y^(2*x) =beta

f(x) = pi * y^[((2/x)^3 + [B/x_i])^n] =(z/B)^(2/x_i)

f(x) = pi * y^[((2/x)^3 +  B/x_i )^n] =(z/B)^(2/x_i)

x = a_avg + ([x-1] /b_trans)^(-y^[-x])

Aquí está el MWE:

documentclassarticle
usepackage[T1]fontenc
usepackagelmodern
usepackagelistofitems,ifthen

defQS[#1]%
  if+Qsep[#1]+else%
  if-Qsep[#1]-else%
  if/Qsep[#1]overelse%
  if=Qsep[#1]=else%
  if^Qsep[#1]^else%
  if(Qsep[#1]bgroupleft(else%
  if)Qsep[#1]right)egroupelse%
  if[Qsep[#1]bgroupelse%
  if]Qsep[#1]egroupelse%
  if*Qsep[#1]cdotelse%
  if_Qsep[#1]expandaftertheundelse%
  csname Qsep[#1]endcsnamefififififififififififi%
%

deftheund#1[#2]_mathrm#1[#2]%

setsepchar[@]cos

makeatletter

defgQ[#1]edeftmp#1expandafter[email protected]@macroexpandafterZ%
  expandafterexpandafterQexpandafter[tmp]
defgQS[#1]edeftmp#1expandafter[email protected]@macroexpandafterZ%
  expandafterexpandafterQSexpandafter[tmp]

makeatother

newcommandinterpreteq[1]%
  defZ%
  greadlist*Q#1%
  presentQ%
  Z%


newcounterlindex
defpresentQ% =
  setcounterlindex0%
  whiledovaluelindex[email protected]ZZZ
  parmedskipnoindent%
  parboxlinewidthdetokenizeexpandafterZZ%
  parmedskip%
  egroup%

makeatother

NewEnvirontranslateeqsexpandafternexteqnBODYparrelax

longdefnexteqn#1par#2relax%
  translateeq#1ifxrelax#2elsenexteqn#2relaxfi%

begindocument
textbfINTERPRETATING EQUATIONS
[
interpreteqcos(1/s) = f*g
]
[
interpreteqf(x) = y^(2*x) =beta
]
[
interpreteqf(x) = pi * y^[((2/x)^3 + [B/x_i])^n] =(z/B)^(2/x_i)
]
[
interpreteqf(x) = pi * y^[((2/x)^3 +  B/x_i )^n] =(z/B)^(2/x_i)
]
[
interpreteqx = a_avg + ([x-1] /b_trans)^(-y^[-x])
]

This is the code ``DNA'' that expresses the above equation:

detokenizeexpandafterZ% COPY/PASTE RESULT OF THIS FROM PDF TO BELOW

See?  I copied/pasted it into equation mode and get the same result.
[
Q [1,1,1,1,1,1,1]QS [1]Q [2,1,1,1,1,1,1]QS [2,1,1,1,1,1]Q [2,1,1,1,1,2,1]QS
[2,1,1,1,1]Q [2,1,1,1,2,1,1]QS [2,1]Q [2,2,1,1,1,1,1]QS [2,2]Q [2,3,1,1,1,1,1]QS
[2,3,1,1,1]Q [2,3,1,1,2,1,1]QS [2,3]Q [2,4,1,1,1,1,1]QS [2,4,1,1]Q [2,4,1,2,1,1,1]QS
[2,4,1,2,1,1]Q [2,4,1,2,1,2,1]QS [2,4]Q [2,5,1,1,1,1,1]QS [2,5,1]Q [2,5,2,1,1,1,1]QS
[2,5]Q [2,6,1,1,1,1,1]QS [2,6,1,1,1]Q [2,6,1,1,2,1,1]QS [2,6,1]Q [2,6,2,1,1,1,1]QS
[2,6]Q [2,7,1,1,1,1,1]QS [2,7,1,1,1]Q [2,7,1,1,2,1,1]QS [2,7]Q [2,8,1,1,1,1,1]QS
[2,8]Q [2,9,1,1,1,1,1]
]

textbfTRANSLATING EQUATIONS
begintranslateeqs% NO BLANK LINE IS PERMITTED HERE
cos(1/s) = f*g

f(x) = y^(2*x) =beta

f(x) = pi * y^[((2/x)^3 + [B/x_i])^n] =(z/B)^(2/x_i)

f(x) = pi * y^[((2/x)^3 +  B/x_i )^n] =(z/B)^(2/x_i)

x = a_avg + ([x-1] /b_trans)^(-y^[-x])
endtranslateeqs% NO BLANK LINE IS PERMITTED BEFORE HERE

translateeqx = a_avg + ([x-1] /b_trans)^(-y^[-x])

enddocument

ingrese la descripción de la imagen aquí

si eq.txt contiene líneas como

x = a_avg + ((x-1)/b_trans)^(-y^(-x))

luego una línea de edición simple como

 sed -e 's/(/(/g' -e 's/)/)/g'  -e 's///\over /g' -e 's/_([a-z]*)/_\mathrm1/g' -e 's/.*/$$/' eq.txt 

saldrá

$x = a_mathrmavg + ((x-1)over b_mathrmtrans)^(-y^(-x))$

para cada línea

que cuando se compone como

documentclassarticle

begindocument

$x = a_mathrmavg + ((x-1)over b_mathrmtrans)^(-y^(-x))$

enddocument

produce

ingrese la descripción de la imagen aquí

Usé sed aquí, pero podrías usar perl o lua o tu editor de búsqueda / reemplazo.


En realidad, necesita trabajar un poco más con la expresión regular en los corchetes (nota uno ) se deslizó hacia abajo …) pero esto espero lo suficiente para mostrar la idea básica.

Reseñas y puntuaciones

Tienes la posibilidad recomendar este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *