pgf 的“将逗号读为句点”无法按预期与 pgfplots 和 lualatex 配合使用

pgf 的“将逗号读为句点”无法按预期与 pgfplots 和 lualatex 配合使用

根据这个答案/pgf/number format/read comma as period应该足以绘制使用逗号而不是句点作为小数分隔符的数据文件中的数据。但是,如以下 MCE 所示:

\begin{filecontents*}[overwrite]{data-periods.dat}
x y
1.5 1
2.5 10
3.5 100
\end{filecontents*}

\begin{filecontents*}[overwrite]{data-commas.dat}
x y
2,5 1
3,5 10
4,5 100
\end{filecontents*}

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
  \addplot table [x=x,y=y]                                         {data-periods.dat} ;
  \addplot table [x=x,y=y,/pgf/number format/read comma as period] {data-commas.dat} ;
\end{axis}
\end{tikzpicture}
\end{document}

在使用 处理时它不起作用(它与一起lualatex使用效果很好),第二个图被删除,原因是:pdflatexxelatex

NOTE: coordinate (--,--,--) [--](was (2,5,1,--)   [--]) has been dropped because of a coordinate filter.
NOTE: coordinate (--,--,--) [--](was (3,5,10,--)  [--]) has been dropped because of a coordinate filter.
NOTE: coordinate (--,--,--) [--](was (4,5,100,--) [--]) has been dropped because of a coordinate filter.

Package pgfplots Warning: the current plot has no coordinates (or all have been filtered away) on input line 36. 

我是否遗漏了什么?

编辑

值得指出的是,该问题不是由tikzdatavisualization库引起的:以下 MCE 使用 lualatex(LuaHBTeX,版本 1.17.0(TeX Live 2023))进行编译,非常顺利。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{datavisualization}
\begin{document}

\begin{tikzpicture}
\datavisualization [school book axes, visualize as line]
data [separator=\space] {
x y
0.5 0
1.5 1
2.5 1
3.5 0
};
\end{tikzpicture}

\pgfset{/pgf/number format/read comma as period}

\begin{tikzpicture}
\datavisualization [school book axes, visualize as line]
data [separator=\space] {
x y
0,5 0
1,5 1
2,5 1
3,5 0
};
\end{tikzpicture}
\end{document}

答案1

软件包 pgfplots (v1.18.1) 手册的第 6.3.1 节“LUA”内容如下

如果您使用compat=1.12(或更新版本) 并通过 编译文档lualatex,则 pgfplots 将激活其lua backend。此开关可减少生成输出文件的时间,尤其是对于 3D 图。

/pgfplots/lua backend=true|false(最初true

如果lua backend处于活动状态,并且文档通过 进行处理lualatexpgfplots则会激活可扩展性和性能改进,从而产生与没有它时相同的输出,但时间更少,并且内存管理更智能。

但正如 OP 的例子所示,lua backend并不总是产生与没有它相同的输出。

lua backend将加载未记录的 tikz-pgf 库luamath,该库将pgfmath数学表达式解析器替换为基于 lua 的新解析器。不幸的是,这个基于 lua 的解析器不支持/pgf/number format/read comma as period。默认情况下tikz,它本身不会加载,因此在(简单或自然)示例luamath中不太可能发现相同的问题。tikz

我已经报告了此事,以pgf查看其问题 #1263。下面是从我的评论中复制的补丁pgfplots问题 #452,其报告的问题基本上与当前 tex-sx 问题相同。

请注意,我对内部原理知之甚少pgfplots,因此下面的补丁非常具体地针对手头的情况。它不是解决根本问题“luamath不支持/pgf/number format/read comma as period”的通用解决方案。

% !TeX program = lualatex
\begin{filecontents}[noheader,force]{data-periods.dat}
x y
1.5 1
2.5 10
3.5 100
\end{filecontents}

\begin{filecontents}[noheader,force]{data-commas.dat}
x y
2,5 1
3,5 10
4,5 100
\end{filecontents}

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}

\makeatletter
\def\pgfplots@LUA@survey@point{%
  \ifpgfmathparsenumber@comma@as@period
    % Assume each point is a single number without any math function calls. 
    % Only then is reading comma as period unambiguous.
    \edef\pgfplots@loc@TMPa{pgfplots.texSurveyPoint(%
      gsub("\pgfplots@current@point@x", ",", "."),%
      gsub("\pgfplots@current@point@y", ",", "."),%
      gsub("\pgfplots@current@point@z", ",", "."),%
      "\pgfplots@current@point@meta")}%
    \pgfplotsutil@directlua{%
      gsub = string.gsub
      \pgfplots@loc@TMPa
    }%
  \else
    \edef\pgfplots@loc@TMPa{pgfplots.texSurveyPoint(%
      "\pgfplots@current@point@x",%
      "\pgfplots@current@point@y",%
      "\pgfplots@current@point@z",%
      "\pgfplots@current@point@meta")}%
    \pgfplotsutil@directlua{\pgfplots@loc@TMPa}%
  \fi
  % increase \pgfplots@current@point@coordindex:
  \advance\c@pgfplots@coordindex by1
}%
\makeatother

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot table [x=x,y=y]
      {data-periods.dat} ;
    \addplot table [x=x,y=y,/pgf/number format/read comma as period]
      {data-commas.dat} ;
  \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容