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
).
-
si desea que el resultado final se redondee a un número entero, utilice
xintiexpr
, por ejemploxintiexpr 123456789987654321/(2^32+3^20)relax
. Demásxintexpr
calculará una fracción. -
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
. -
al contrario de
numexpr
que se puede utilizar directamente en lugares donde TeX espera un número (entero), por ejemplo en unifnum
prueba, unaxintiexpr
debe tener el prefijoxintthe
:xintthexintiexpr
(oxinttheiexpr
). Pero, naturalmente, el número producido debe ser menor que el2^31
límite. -
un
xintthexintexpr
(o, más cortoxinttheexpr
) no se puede utilizar en unifnum
prueba, ya que TeX no entiende fracciones. El paquete proporciona pruebas propias para comparar números, incl. fracciones. -
un
xintexpr
La expresión debe terminar con unrelax
mientras que unnumexpr
terminará legalmente en cualquier token (como un punto.
) no esperado por su sintaxis. -
numexpr -(1+2)relax
¡No funciona! peroxintexpr -(1+2)relax
lo hace… -
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
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]
por razones desconocidas para mí (esto parece ser algún mecanismo de protección).
Simplemente input
tintineo 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
Si te gusta la informática, tienes la libertad de dejar un artículo acerca de qué te ha impresionado de este enunciado.