Предположим, у меня есть следующий документ:
\documentclass{article}
\newcommand\mass{30}
\newcommand\acc{9.8}
\newcommand\force{\the\numexpr \mass * \acc \relax} % F=m*a
\begin{document}
\section{Exerted force}
F = \force N
\end{document}
Он создает три «переменные»: mass
, acc
и force
, которая является произведением первых двух.
В этом конкретном примере ( mass = 30
, acc = 9.8
) печатается F = 270.8N
, как и задумано.
Умножение выполняется командой \numexpr
. Это работает всякий раз, когда mass
и acc
являются обычными числами. Если mass
или acc
является переменной (т.е. \newcommand\mass{m}
), документ не может быть построен, так как \numexpr
может выполнять операции только с числами.
Есть ли способ выполнять алгебраические операции над переменными, так что когда mass = 30g
и acc = g
, он выведет F = 30g^2
? Я знаю, что это не имеет физического смысла, но я думаю, что суть ясна.
Еще несколько примеров:
mass = m
,acc = 9.8
->F = m*9.8
илиF = 9.8*m
mass = m
,acc = g
->F = m*g
илиF = g*m
mass = x
,acc = x
->F = x^2
EDIT: Как любезно указал @PhelypeOleinik,\numexpr
работает только нацелые числа. Таким образом, хотя 9,8 * 30 = 294, в результате получается 270,8, поскольку 30 * 9 = 270 и добавляется 0,8.
решение1
Вот код, использующий sagetex
запрошенный вами пакет:
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
m = 30.0
a = 9.8
Force = m*a
var('g')
mass = 30*g
\end{sagesilent}
\section{Exerted force}
F = $\sage{Force.n(digits=5)}$ N \\\\
If the mass is $\sage{mass}$ then it's square is $\sage{mass^2}$.
\begin{sagesilent}
var('m')
acc = 9.8
\end{sagesilent}
$F = \sage{m*acc.n(digits=2)}$\\
\begin{sagesilent}
var('a')
m=a
\end{sagesilent}
If the mass, $m$, is equal to the acceleration, $a$ then
$F = \sage{m*a}$.
Sage even works with square roots:
\begin{sagesilent}
var('g')
m=sqrt(3)
\end{sagesilent}
$F = \sage{m*g}$ which, if you want decimals, is about $F=\sage{m.n(digits=4)*g}$
\end{document}
Вывод, запущенный в Cocalc (упомянутом в моем комментарии выше), выглядит так:
В Sage x по умолчанию является переменной. Все остальные переменные должны быть определены так, как это сделано в коде, например var('g'). Среда sagesilent
похожа на черновик. Она состоит из команд Python и Sage, которые будут выполнять вычисления. Используйте формат, \sage{}
чтобы получить результат. Поскольку это число, это делается в математическом режиме (между знаками доллара). Sage будет стремиться выдавать много цифр. Это .n(digits=5)
заставит ответ состоять из 5 значащих цифр.
решение2
Вы можете использовать pythontex
пакет для встраивания Python в документ LaTeX, а затем использовать sympy
пакет Python для символьных вычислений, например:
\documentclass{article}
\usepackage{pythontex}
\begin{pycode}
from sympy import *
m = sqrt(3)
a = symbols('g')
f = m * a
\end{pycode}
\begin{document}
\section{Exerted force}
F = $\pyc{print(latex(f))}$
\end{document}
Для этого требуется, чтобы у вас были установлены LaTeX, python3, pythontex
пакет для LaTeX и sympy
пакет для python. Также не помешает некоторое знание python.
Краткое объяснение кода:
\usepackage{pythontex}
импортирует требуемый пакет.
\begin{pycode}
начинает блок кода Python.
Давайте рассмотрим следующий блок кода Python:
from sympy import *
m = sqrt(3)
a = symbols('g')
f = m * a
Это импортирует sympy
библиотеку, устанавливает m
равным квадратному корню из 3 и a
переменной g
. Затем он умножает m
и a
и сохраняет результат в f
. Обратите внимание, что sqrt()
функция, используемая для извлечения квадратного корня из 3, является функцией из библиотеки sympy
, а не из математической библиотеки. Это означает, m
чтоточноравно sqrt(3)
и не является приближением.
$\pyc{latex(f)}$
затем печатает все, что latex(f)
возвращается. Значение f теперь равно sqrt(3) * g
. При передаче его через latex()
функцию оно печатается с использованием нотации LaTeX, поэтому знаки доллара необходимы для входа в математический режим.
Это можно сделать, сначала вызвав latex
, затем pythontex
и latex
еще раз.
В конечном итоге документ будет выглядеть так:
Некоторые ресурсы по теме sympy
и pythontex
: