问题描述

问题描述

问题描述

我有一个 LaTeX 项目依赖于\usepackage{pgfplots}\usepackage{forest}

pgfplots自升级到 TeX Live 2016 以来,如果文档包含启用了该选项\begin{forest}的环境,则该包的存在会破坏编译folder

错误消息表明这是因为pgfplots想要使用 FPU,但环境folder中的选项forest依赖于ModFPU 中尚未实现的操作:

! 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

对于非常粗糙的临时破解,您可以将的含义重定向到Modmod并接受从中得到负数的风险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 实数

相关内容