我以前曾使用过\footnotesize
scale 标签,并且它产生了所需的结果。但是当我将其作为标签的一部分传递给宏时遇到了问题。以下 MWE 可以编译,但如果我注释掉重新定义的行,则不会编译\footnotesize
。
\ShowIntersection
如果需要,可以找到更多详细信息PGFplot 中的交叉点并且GetListMember
可以在访问列表特定成员的宏
\documentclass{standalone}
\usepackage{xstring}
\usepackage{pgfplots}
\usetikzlibrary{intersections}
\pgfkeys{/pgfplots/Linear Axis Style/.style={
clip=true,
minor tick num=0,
axis y line=center,
axis x line=middle,
x axis line style={name path global=XAxisLine},
y axis line style={name path global=YAxisLine}
}
}
\begin{document}
\newcommand*\GetListMember[2]{\StrBetween[#2,\number\numexpr#2+1]{,#1,},,}%
\newcommand*{\ShowIntersection}[3]{
\fill
[name intersections={of=#1 and #2, name=i, total=\t}]
[red, opacity=1, every node/.style={black, opacity=1}]
\foreach \s in {1,...,\t}{(i-\s) circle (2pt)
node [above left, blue] {\GetListMember{#3}{\s}}};
}
\begin{tikzpicture}
\begin{axis}[Linear Axis Style,
xmin=-1.5, xmax=1.51,% Need asymmetry here due to bug in PGFplots
ymin=-1, ymax=3,
]
\addplot[name path global=a, mark=none, domain=-2.5:2.5, thick] ({x},{x*x-0.5});%
\def\footnotesize{}% Why can I not comment this out?
\ShowIntersection{a}{XAxisLine}{{\footnotesize{$X_1$}},{$(A,B)$}}
\ShowIntersection{a}{YAxisLine}{{\footnotesize{$Y$}}}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
要修复此问题,请使用\normalexpandarg
设置xstring
(例如在序言中)或写入\noexpand\noexpand\noexpand\footnotesize
而不是仅仅使用\footnotsize
。
问题在于xstring
操作。MWE 将是:
\documentclass{article}
\usepackage{xstring}
\begin{document}
% your macro:
\newcommand*\GetListMember[2]{\StrBetween[#2,\number\numexpr#2+1\relax]{,#1,},,}%
\GetListMember{\footnotesize A}{1}
% or just:
\StrBetween[1,2]{,\footnotesize,}{,}{,}
\end{document}
宏的定义\footnotesize
以 开头\@setfontsize \footnotesize ...
,其中\@setfontsize
包括\let \@currsize #1
,即每个字体大小宏都将自身存储为\@currsize
(假设以后能够恢复)。现在\StrBetween
将字符串扩展两次。显然,在读入逗号分隔的值时会扩展一次,然后在选定的子字符串中再次扩展一次。因此,您需要使用\noexpand
两次加一,即三次(不扩展第二个\noexpand
)。
\normalexpandarg
的(或者\expandarg
)宏以xstring
不进行这些扩展的方式定义一些内部宏(\def
而不是\edef
)。