在 tikz 节点标签中使用 \footnotesize

在 tikz 节点标签中使用 \footnotesize

我以前曾使用过\footnotesizescale 标签,并且它产生了所需的结果。但是当我将其作为标签的一部分传递给宏时遇到了问题。以下 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)。

相关内容