Saltar al contenido

¿Cómo sumar, restar, multiplicar y dividir en TeX simple?

Comprende el código correctamente antes de usarlo a tu trabajo si tquieres aportar algo puedes decirlo en los comentarios.

Solución:

Puedes hacer aritmética (con +, -, *, /, pero no ^ para poderes) usando numexpr Expresiones

los numexpr las expresiones se encuentran entre las e-TeX extensiones de los Knuth TeX.

(Extensiones e-TeX: en instalaciones modernas están activadas por defecto, excepto si usa el ejecutable llamado tex en la línea de comando)

Sin embargo, no puede usar números verdaderamente fraccionarios dentro numexpr...relax (por ejemplo haciendo 1/7+1/3). Y / hace allí una división (redondeada) al número entero más cercano. Los enteros deben estar entre -2147483647 y +2147483647: esta es la misma limitación que para los enteros que se pueden almacenar en un TeX count o en un LaTeX counter; y un count se puede utilizar directamente dentro de un numexpr expresión, para un LaTeX counter uno tiene valuemycountername.

Escribí el paquete xintexpr que se puede usar en Plain TeX (input xintexpr.sty) o en LaTeX (usepackagexintexpr).

  1. si desea que el resultado final se redondee a un número entero, utilice xintiexpr, por ejemplo xintiexpr 123456789987654321/(2^32+3^20)relax. Demás xintexpr calculará una fracción.

  2. si quieres la fracción en forma irreducible, usa el reduce función: xintexpr reduce (1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10)relax.

  3. al contrario de numexpr que se puede utilizar directamente en lugares donde TeX espera un número (entero), por ejemplo en un ifnum prueba, una xintiexpr debe tener el prefijo xintthe: xintthexintiexpr (o xinttheiexpr). Pero, naturalmente, el número producido debe ser menor que el 2^31 límite.

  4. un xintthexintexpr (o, más corto xinttheexpr) no se puede utilizar en un ifnum prueba, ya que TeX no entiende fracciones. El paquete proporciona pruebas propias para comparar números, incl. fracciones.

  5. un xintexpr La expresión debe terminar con un relax mientras que un numexpr terminará legalmente en cualquier token (como un punto .) no esperado por su sintaxis.

  6. numexpr -(1+2)relax ¡No funciona! pero xintexpr -(1+2)relax lo hace…

  7. xintexpr es completamente ampliable.

De ahí cosas como:

messagexinttheexpr reduce (1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10)relax
message xinttheiexpr 123456789987654321/(2^32+3^20)relax

es posible.

Código para el caso de uso de OP:

input xintexpr.styrelax % compile with etex or pdftex

% macro to use xinttheiexpr which will round to the nearest whole number.
defroundandprint #1xinttheiexpr #1relax 

defweeks20          % term is twenty weeks
deflessonsperweek3  % meets three times per week
deflessonduration60 % meets for sixty minutes

defpercentlectures.5    % half the time is spent in lectures
defpercentdiscussions.2 % 20 percent of the time is spent in disucssions

% remaining percent of time left to lab work:
defpercentlabxintexpr 1 - percentdiscussions - percentlecturesrelax 

% minutes spent in lessons:
deftotaldurationxintexpr lessonduration * lessonsperweek * weeksrelax 

% total duration in hours:
deftotaldurationhoursxintexpr totalduration / 60 relax

% minutes spent in the lab:
deflabdurationxintexpr totalduration * percentlab relax 

Total time in lab: roundandprintlabduration minutes.

Total minutes in class: roundandprinttotalduration minutes.

Total hours in class: roundandprinttotaldurationhours hours.

defweeks19 % these two values are changed later in the document
deflessonsperweek2

Total minutes in class: roundandprinttotalduration minutes. % this value
                                % would be different because of the chagnes to
                                % weeks and lessonsperweek

bye

sumar-restar-multiplicar

Observación: los diversos xintexpr ... relax en percentlab etc … son un poco opcionales; podrían haber sido reemplazados por paréntesis, pero usando tales xintexpr ... relax las sub-expresiones proporcionan la máxima flexibilidad. Por ejemplo, se pueden incrustar en un edef, naturalmente si todo lo involucrado en el cálculo se define en ese momento.

Como se mencionó en un ejemplo anterior, el ^ para potencias se acepta: pero el exponente debe ser un número entero (3^(10/2) está bien para xintexpr, que calculará correctamente 3^5). Hay un sqrt función, que calcula la raíz cuadrada con, por defecto, 16 dígitos de precisión. Un segundo argumento opcional permite más precisión:

xinttheexpr sqrt(2,60)relax

da 60 dígitos de precisión. Para obtener el resultado en notación científica, hay:

xintthefloatexpr sqrt(2,60)relax

El texto plano (de forma única) se usa generalmente con el motor Tex clásico (o al menos con las extensiones pdf y e-tex deshabilitadas) por lo que no hay aritmética infija

newcountzzz
zzz=5
multiplyzzz by 3
advancezzz by 2

conjuntos zzz a 17. Si usa el formato plano con e-tex, puede usar e-tex infix arithmentic

newcountzzz
zzz=numexpr 5*5 + 2relax

Puede utilizar PGFmath.

Para pgfmathprintnumber de (pgfmathfloat.code.tex) es necesario definir [email protected]

@protect por razones desconocidas para mí (esto parece ser algún mecanismo de protección).
Simplemente inputtintineo pgf.tex también funciona.

Código

expandafterdefcsname [email protected]@protectendcsname%
input pgfmath.tex
defweeks20          % term is twenty weeks
deflessonsperweek3  % meets three times per week
deflessonduration60 % meets for sixty minutes

defpercentlectures.5    % half the time is spent in lectures
defpercentdiscussions.2 % 20 percent of the time is spent in disucssions
                            % remaining percent of time left to lab work
defpercentlab1 - percentdiscussions - percentlectures
                            % minutes spent in lessons
deftotaldurationlessonduration * lessonsperweek * weeks
deftotaldurationhours(totalduration) / 60
deflabduration(totalduration) * (percentlab) % minutes spent in the lab

pgfset
  number format/.cd,
  min exponent for 1000 sep=4,
  int detect,

Total time in lab: pgfmathprintlabduration (pgfmathprintnumber[fixed,precision=0]pgfmathresult) minutes.

Total minutes in class: pgfmathprinttotalduration
                 (pgfmathprintnumberpgfmathresult) minutes.

Total hours in class: pgfmathprinttotaldurationhours 
               (pgfmathprintnumberpgfmathresult) hours.

defweeks19         % these two values are changed later in the document
deflessonsperweek2
                       % minutes spent in lessons

% this value would be different because of the chagnes to weeks and lessonsperweek
Total minutes in class: pgfmathprinttotalduration
                 (pgfmathprintnumberpgfmathresult) minutes.
bye

Producción

ingrese la descripción de la imagen aquí

Si te gusta la informática, tienes la libertad de dejar un artículo acerca de qué te ha impresionado de este enunciado.

¡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 *