考虑以下代码:
\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\newcommand\myxtick[1]{\foreach \x in {2,3,4}{\x,}#1}
\newcommand\otherxtick{2,3,4,5}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
%xtick={\myxtick[5]},
xtick={\otherxtick},
xmax=10,xmin=0,ymax=10,domain=0:10]
\addplot {x};
\end{axis}
\end{tikzpicture}
\end{document}
如果我指定 ,xtick
代码\otherxtick
可以工作,但如果我使用 ,\myxtick[5]
它会出现错误并且无法编译。我也尝试了xtick./expanded={\myxtick[5]}
,xtick./expand once={\myxtick[5]}
和,xtick./expand twice={\myxtick[5]}
但结果相同。
我也看了这些问题,但没有结果:
我问这个问题是因为刻度定义的符号{1,2,...,20}
并不总是可用的。例如,考虑一个dateplot
你想要从 1900 年到 1960 年每 3 年刻度的程序。如果我写{1900-01-01,1903-01-01,...,1960-01-01}
它不起作用,写所有 21 个刻度非常无聊...
答案1
问题在于您定义列表的方式。\othertick
是一个“好”列表,而 则\myxtick
不是。
您需要的是一种能够创建要传递给的列表的命令xtick
:要做到这一点,您必须考虑列表分隔符(逗号)的位置以及 foreach 对事物进行分组的事实,因此以这种方式创建的列表不是全局的。
一个解决方案是:
\newcommand{\deflisttick}[1]{
\gdef\listticks{}% global list
\foreach \x[count=\xi] in {#1}{\global\let\maxitems\xi}% count the max number of items
\foreach \x[count=\xi] in {#1}{
\ifnum\xi=\maxitems
\xdef\listticks{\listticks \x}
\else
\xdef\listticks{\listticks \x,}
\fi
}
}
在这种情况下,我检查列表的最后一个元素:处理时,列表中没有添加最后的逗号(还有其他方法可以实现这一点)。
然后在文档中调用:
\deflisttick{1,3,...,9}
这将创建:1,3,5,7,9
。例如:
\documentclass[border=2pt]{standalone}
\usepackage{pgfplots}
\newcommand{\deflisttick}[1]{
\gdef\listticks{}% global list
\foreach \x[count=\xi] in {#1}{\global\let\maxitems\xi}% count the max number of items
\foreach \x[count=\xi] in {#1}{
\ifnum\xi=\maxitems
\xdef\listticks{\listticks \x}
\else
\xdef\listticks{\listticks \x,}
\fi
}
}
\begin{document}
\deflisttick{1,3,...,9}
\begin{tikzpicture}
\begin{axis}[
xtick={\listticks},
xmax=10,xmin=0,ymax=10,domain=0:10]
\addplot {x};
\node at (axis cs: 2,5){\listticks};% debug purposes
\end{axis}
\end{tikzpicture}
\end{document}