다음과 같은 이유를 모르기 때문에 이는 확장 관련 문제 중 하나임에 틀림없습니다.
\def\MaxValueOfTok{8}%
\newtoks{\SomeTokDefinedViaDef}
\SomeTokDefinedViaDef={\MaxValueOfTok}
\pgfmathsetmacro{\Difference}{10-\the\SomeTokDefinedViaDef}%
실패하다
패키지 PGF 수학 오류: 알 수 없는 연산자
8' or
8@'('10-8').
\pgfmathsetmacro
가능하다면 계산 변경만 필요하고 토큰 정의 방법은 변경할 필요가 없는 솔루션을 선호합니다 . 또는 \def
설정 방법을 조정하는 것도 효과적입니다.
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
같습니다.많이더 정확합니다(TeX의 차원 범위에 비해 16자리 부동 소수점). 속도는 비슷합니다.
상자 측정( ...) 및 난수와 같은 몇 가지 함수는
l3fp
표현식 내에서 사용하기 위해 구현되지 않을 가능성이 높습니다.\widthof