使用 .estore 和 .store 作为下标的 pgfkeys 之间的区别

使用 .estore 和 .store 作为下标的 pgfkeys 之间的区别

以下 MWE 为使用和的 pgfkeys 产生两个不同的下标.estore,并且似乎使用产生正确下标的.store那个。.store

这种差异的原因是什么?是否与有冲突amsmath

\documentclass[]{standalone}
\usepackage{amsmath}
\usepackage{tikz}

\pgfkeys{/sdof/.is family, /sdof,
    disp text estore/.estore in = \disptextestore,
    disp text store/.store in = \disptextstore,}

\newcommand{\sdof}[1][]{\pgfkeys{/sdof, #1}
    \node at (0,0) {\disptextestore};
    \node at (2,0) {\disptextstore};
}

\begin{document}

\begin{tikzpicture}
    \sdof[disp text estore=Estore: $x_{\text{s}}$,
          disp text store=Store: $x_{\text{s}}$,]
    \node at (4, 0) {Typical: $x_{\text{s}}$};
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案1

您所面临的问题与 无关pgfkeys,而是来自\edef和的结合\protect

让我考虑以下 MWE。

\documentclass{article}
\usepackage{amstext}
\def\foo{
  \displaystyle \text{D},
  \textstyle \text{T},
  \scriptstyle \text{S},
  \scriptscriptstyle \text{SS},
}
\edef\bar{\foo}
\begin{document}
$\foo \quad \bar$
\end{document}

结果就是这样,你会发现\texts 不尊重\...style中前面的 s \bar

不工作 \text

这是因为该\text命令定义amstext.sty

\DeclareRobustCommand{\text}{%
  \ifmmode\expandafter\text@\else\expandafter\mbox\fi}

这意味着\text是一个自\protect命令,因此在大多数情况下是安全的,但由于是一个 TeX 原语,因此\protect无法在内部存活。\edef\edef

某个工作中的强大命令\edef。例如,

\documentclass{article}
\usepackage{amstext}
\makeatletter
\def\foo{
  \displaystyle \text{D},
  \textstyle \text{T},
  \scriptstyle \text{S},
  \scriptscriptstyle \text{SS},
}
\let\@@protect\protect
\let\protect\@unexpandable@protect
\edef\bar{\foo}
\let\protect\@@protect
\makeatother
\begin{document}
$\foo \quad \bar$
\end{document}

将得到预期结果(这就是我们\protected@edef要做\protectded@xdef的)。但是,这取决于具体情况。

受保护

您还可以从 e-TeX 中受益\protected(可能使用该etoolbox包):

\documentclass{article}
\usepackage{amstext}
\usepackage{etoolbox}
\makeatletter
\robustify{\text}  % this utilizes the e-TeX's low-level feature instead of LaTeX's high-level protection.
\def\foo{
  \displaystyle \text{D},
  \textstyle \text{T},
  \scriptstyle \text{S},
  \scriptscriptstyle \text{SS},
}
\edef\bar{\foo}
\makeatother
\begin{document}
$\foo \quad \bar$
\end{document}

.estore in话虽如此,我的建议是,除非绝对必要,否则避免使用该处理程序。

相关内容