以下 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}
结果就是这样,你会发现\text
s 不尊重\...style
中前面的 s \bar
。
这是因为该\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
话虽如此,我的建议是,除非绝对必要,否则避免使用该处理程序。