
Я наткнулся на другие вопросы по tex, в которых люди спрашивали о способах представления чисел в формате, разделенном запятыми. То есть, 1234567 записывается как 1 234 567. Мне это нужно, когда я обучаю своего ребенка сложению/вычитанию. Я пытаюсь создать рандомизированный список задач на сложение, который становится сложнее с каждым днем. По сути, я хочу запустить код и создать, скажем, 30-дневный набор ежедневных задач, который становится сложнее по мере продвижения. Хотя я могу настраивать его для своего ребенка на ходу, в нем участвуют и другие дети, и у них не будет возможности получить ко мне доступ. Так что все зависит от родителей. Короче говоря, вот проблема, с которой я столкнулся:
Ранее представленные решения этой проблемы имеют две проблемы:
Многие не очень хорошо работают в математическом режиме!
(и это моя главная проблема) Я хотел бы сделать что-то вроде этого (используя пакет numprint в качестве неудачного примера):
$\numprint{\sage{12454785*34}}$
Как вы можете догадаться, это не работает, поскольку \numprint
считывает строку, и это не сулит ничего хорошего \sage{...}
внутри! Я думал определить свою собственную функцию sage, а затем использовать, \sagestr{}
но это дает временное решение, так как позже я буду использовать тот же набор файлов для генерации некоторого онлайн-контента, что НЕ сулит ничего хорошего \sagestr
(другая история!).
решение1
Просто несколько мыслей, а не ответ:
- Лично я бы избегал sage. LaTeX может выполнять вычисления самостоятельно (по крайней мере с expl3).
- Вам не следует изобретать велосипед. Ваш
\numprint
в любом случае будет хужеsiunitx
's\num
. - Обновление: как Мико упомянул в комментариях под вашим вопросом, вы могли бы рассмотреть возможность адаптации одного из решений изэтот вопрос. В сочетании с моим следующим фрагментом кода версия egreg подойдет.
Вот очень простой подход к \numberfromcalc
макросу, который просто ожидает вычисления некоторого числового выражения, а затем выводит отформатированный результат независимо от того, находитесь ли вы в математическом режиме или нет.
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand { \numberfromcalc } { m }
{
\int_set:Nn \l_tmpa_int { #1 }
\num[group-separator={,}]{\int_use:N \l_tmpa_int}
}
\ExplSyntaxOff
\begin{document}
\noindent\numberfromcalc{12454785*34}\\
$\numberfromcalc{12454785*34}$
\end{document}
Поскольку вы не опубликовали какой-либо код, я не буду пытаться генерировать здесь какие-то случайные списки, но это тоже не так уж и сложно. Как я уже сказал, это только начало.
решение2
Одно из преимуществ использования Sage в том, что он построен на Python. Так что вы получаете множество встроенных функций без длинного, сложного для чтения кода. В этом случае измените числа на строки в Sage и вставьте запятые перед переходом в LaTeX.
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
a = Integer(randint(1000,10000))
b = Integer(randint(1000,10000))
\end{sagesilent}
\noindent What's $\sagestr{"{0:12,.0f}".format(a)} \times \sagestr{"{0:12,.0f}".format(b)}$?\\
Answer: $\sagestr{"{0:12,.0f}".format(a*b)}$
\end{document}
Результат работы CoCalc выглядит следующим образом:
Информация о команде создания запятыхздесь.