Это, должно быть, еще одна из проблем, связанных с расширением, так как я не знаю, почему следующее
\def\MaxValueOfTok{8}%
\newtoks{\SomeTokDefinedViaDef}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\pgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedViaDef}%
терпит неудачу с
Математическая ошибка пакета PGF: неизвестный оператор
8' or
8@' (в '10-8').
Если возможно, предпочел бы решение, которое требует только изменения вычисления \pgfmathsetmacro
, и не требует никаких изменений в том, как определяется токен. В качестве альтернативы, корректировка того, как \def
настроен is, также сработает.
Раскомментирование последних двух строк в MWE приведет к воспроизведению проблемы.
Код:
\documentclass{article}
\usepackage{tikz}% Easy way to get pgfmath
\def\MaxValueOfTok{8}%
\newtoks{\SomeTokDefinedDirectly}
\newtoks{\SomeTokDefinedViaDef}
\SomeTokDefinedDirectly={7}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\begin{document}
\pgfmathsetmacro{\Difference}{10-5}%
Differerence is \Difference (numerical).
\pgfmathsetmacro{\Difference}{10-\MaxValueOfTok}%
Differerence is \Difference (using def).
\pgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedDirectly}%
Differerence is \Difference (using SomeTokDefinedDirectly).
%\pgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedViaDef}%
%Differerence is \Difference (using SomeTokDefinedViaDef).
\end{document}
решение1
Вы можете выполнить полное расширение заранее:
\documentclass{article}
\usepackage{pgf}% Easy way to get pgfmath
\def\epgfmathsetmacro#1#2{\begingroup
\edef\x{\endgroup\noexpand\pgfmathsetmacro\noexpand#1{#2}}\x}
\def\MaxValueOfTok{8}%
\newtoks\SomeTokDefinedDirectly
\newtoks\SomeTokDefinedViaDef
\SomeTokDefinedDirectly={7}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\begin{document}
\epgfmathsetmacro{\Difference}{10-5}%
Differerence is \Difference (numerical).
\epgfmathsetmacro{\Difference}{10-\MaxValueOfTok}%
Differerence is \Difference (using def).
\epgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedDirectly}%
Differerence is \Difference (using SomeTokDefinedDirectly).
\epgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedViaDef}%
Differerence is \Difference (using SomeTokDefinedViaDef).
\end{document}
решение2
Вам придется расширить его вручную, используя 10\expandafter-\the\SomeTokDefinedViaDef
.
\documentclass{article}
\usepackage{tikz}% Easy way to get pgfmath
\def\MaxValueOfTok{8}%
\newtoks{\SomeTokDefinedDirectly}
\newtoks{\SomeTokDefinedViaDef}
\SomeTokDefinedDirectly={7}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\begin{document}
\pgfmathsetmacro{\Difference}{10-5}%
Differerence is \Difference (numerical).
\pgfmathsetmacro{\Difference}{10-\MaxValueOfTok}%
Differerence is \Difference (using def).
\pgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedDirectly}%
Differerence is \Difference (using SomeTokDefinedDirectly).
\pgfmathsetmacro{\Difference}{10\expandafter-\the\SomeTokDefinedViaDef}%
Differerence is \Difference (using SomeTokDefinedViaDef).
\end{document}
решение3
Другой вариант — заменить pgfmath
на l3fp
из l3kernel
пакета. Анализатор в l3fp
позаботится о расширении всего; он также распаковывает содержимое \toks
и других регистров. Нет необходимости в \the
.
\documentclass{article}
%% Load expl3 for l3fp, and xparse for \NewDocumentCommand.
\usepackage{expl3, xparse}
\ExplSyntaxOn
\NewDocumentCommand {\explfpsetmacro} { m m }
{ \tl_set:Nx #1 { \fp_to_tl:n {#2} } }
\ExplSyntaxOff
%%
\def\MaxValueOfTok{8}%
\newtoks{\SomeTokDefinedDirectly}
\newtoks{\SomeTokDefinedViaDef}
\SomeTokDefinedDirectly={7}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\begin{document}
\explfpsetmacro{\Difference}{10-5}%
Differerence is \Difference (numerical).
\explfpsetmacro{\Difference}{10-\MaxValueOfTok}%
Differerence is \Difference (using def).
\explfpsetmacro{\Difference}{10-\SomeTokDefinedDirectly}%
Differerence is \Difference (using SomeTokDefinedDirectly).
\explfpsetmacro{\Difference}{10-\SomeTokDefinedViaDef}%
Differerence is \Difference (using SomeTokDefinedViaDef).
\end{document}
Несколько вещей, на которые следует обратить внимание:
- на данный момент
pgfmath
предоставляет больше функций, чемl3fp
; - вычисления с
l3fp
являютсямногоболее точный (16 цифр с плавающей точкой, по сравнению с диапазоном размерностей TeX); скорость сопоставима;
некоторые функции, скорее всего, никогда не будут реализованы для использования в
l3fp
выражениях, а именно измерения ящиков (\widthof
...) и случайные числа.