问题描述
我有一个 LaTeX 项目依赖于\usepackage{pgfplots}
和\usepackage{forest}
。
pgfplots
自升级到 TeX Live 2016 以来,如果文档包含启用了该选项\begin{forest}
的环境,则该包的存在会破坏编译folder
。
错误消息表明这是因为pgfplots
想要使用 FPU,但环境folder
中的选项forest
依赖于Mod
FPU 中尚未实现的操作:
! Package PGF Math Error: Sorry, the operation 'Mod' has not yet been implemented in the floating point unit.
因为我的项目需要这两个包,所以我想找到解决这个问题的方法。我怀疑停用 FPU via\pgfkeys{/pgf/fpu=false}
可能是一种选择,但我不确定如何将其应用于下面的 MWE。
最小工作示例
将以下 MWE 保存到main.tex
并使用 进行编译pdflatex main
。然后,取消注释标记的行TODO
并尝试重新编译(将失败)。
\documentclass{standalone}
% NOTE: [edges] option required to enable 'folder' option in
% 'forest' environment below.
\usepackage[edges]{forest}%
% TODO: Uncomment the line below to break compilation
%\usepackage{pgfplots}%
\begin{document}
\begin{forest}%
for tree={folder}% NOTE: Problem only occurs with this option enabled
[foo%
[bla]%
[moo]%
]%
\end{forest}%
\end{document}
答案1
对于非常粗糙的临时破解,您可以将的含义重定向到Mod
,mod
并接受从中得到负数的风险mod
因此添加
\let\pgfmathMod=\pgfmathmod\relax
但如果我能找到卸载版本fpu
的位置Mod
,我想添加这个可以解决这个问题。fpu
不过这需要更改库。
\def\pgfmathfloatMod@#1#2{%
\begingroup%
\pgfmathfloatmod@{#1}{#2}%
\let\pgfmathfloat@loc@TMPa=\pgfmathresult%
\pgfmathfloatifflags{\pgfmathresult}{-}{\pgfmathfloatadd@{\pgfmathfloat@loc@TMPa}{#2}%
\pgfmath@smuggleone\pgfmathresult%
\endgroup%
}
然而,Christian Feuersänger 可以解决这个问题。
答案2
根本原因是 FPU 库中的一个旧错误:它无法卸载那些带有错误消息“未实现”的命令。
该问题在 pgfplots 的最新稳定版本中变得明显,它在全球范围内调用“激活 fpu ... 停用 fpu” - 并且停用失败。
我会照顾它。
解决当前问题的一个方法是
\documentclass{standalone}
% NOTE: [edges] option required to enable 'folder' option in
% 'forest' environment below.
\usepackage[edges]{forest}%
\makeatletter
\let\pgfmathModX=\pgfmathMod@
\usepackage{pgfplots}%
\let\pgfmathMod@=\pgfmathModX
\makeatother
\begin{document}
\begin{forest}%
for tree={folder}% NOTE: Problem only occurs with this option enabled
[foo%
[bla]%
[moo]%
]%
\end{forest}%
\end{document}
请注意,这会影响以下操作:
isprime iseven gcd frac 随机 setseed Mod div 实数