我正在尝试使用pgfplots
一些 python 输出轻松绘图。我真的不喜欢matplotlib2tikz
默认行为,即复制 matplotlib 的默认参数,而且我找不到如何覆盖它。我想要我的基本轴,所以所有的自定义配置都会在我的\pgfplotsset{}
.
所以我用 python 做了一些基本函数,并用 调用它们sagetex
。我喜欢这个包,因为我可以加载所有导入并在文档的任何位置访问结果。它几乎完美运行,除了 和babel
french 选项。这是一个 MWE :
\documentclass[tikz]{standalone}
\usepackage{sagetex}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage[french]{babel} %<--- Any one of these make it fail
%\usepackage[frenchb]{babel} %<--- This
%\usepackage[francais]{babel} %<--- This
%\usepackage[english]{babel} %<--- But this one is okay.
\begin{document}
%Import python function
\begin{sagesilent}
############## python code
def addplot_coordinates(*args, **kwargs):
if len(kwargs) is 0:
code = [r'\addplot coordinates {']
else:
code = [r'\addplot[']
for key, value in kwargs.items():
code.append(' {0} = {1},'.format(key, str(value)))
code.append(' ] coordinates {')
while True:
try:
value = [str(x.pop()) for x in args]
except IndexError:
break
line = ' ( ' + ' , '.join(value) + ' )'
code.append(line)
code.append(r'} ;')
return '\n'.join(code)
# Print a test in standard output during sage compilation to be sure it works
print(addplot_coordinates([1,3,2,4], [2,5,3,2], draw='black'))
############## end of python code
\end{sagesilent}
\begin{tikzpicture}
\begin{axis}
% This plot works fine
\addplot[
draw = blue,
] coordinates {
( 4 , 2 ) ( 2 , 1 ) ( 3 , 2 ) ( 1 , 1 )
} ;
% This plots fails
\sagestr{addplot_coordinates([1,2,3,4], [4,3,4,3], draw='red')}
\end{axis}
\end{tikzpicture}
\end{document}
不使用babel
或使用英语选项,都可以编译(pdflatex、sage、pdflatex)。但使用其中一个法语选项时,我在第二次 pdflatex 编译期间出现此错误:
Runaway argument?
;{}{}{}\null \fi \@safe@activesfalse \end {NoHyper}\@ifundefined {r@\ETC.
! File ended while scanning use of \pgfplots@addplotimpl@coordinates.
<inserted text>
\par
<*> TestBug.tex
我发现SageTex 手册关于NoHyper
环境(第 22 页),说出现了问题,但我不明白,好像我应该用某种东西保护我的代码。
值得一提的是,只要满足以下条件,一切都会好起来:
- 我没有调用
\addplot
命令 - 我使用其他
babel
选项
有人知道会发生什么吗?另外,我完全可以编写这个 pgf-python 接口,因为它可以让我更好地控制我所做的事情,但请随时给我更好的建议。
感谢您的时间!
答案1
事实上,这只是一个简单的babel
问题tikz
。
正如 Zarko 在评论中所建议的那样,添加:
\usetikzlibrary{babel}
解决了问题。