Amsmath 和 tikz - 冲突吗?

Amsmath 和 tikz - 冲突吗?

我有一个问题:

\documentclass{minimal} 
\usepackage[T1]{fontenc} 
\usepackage[french]{babel}

\usepackage{amsmath} 
\usepackage{tikz}

\begin{document}
 \pgfmathparse{ifthenelse(1<0, "100","$\sin(x)$")}\pgfmathresult
\end{document}

错误:

 ./MinimalConflit_amsmath.tex:9: Argument of \@gobble has an extra }.
 <inserted text>
 \par ** l.9 ...thparse{ifthenelse(1<0, "100","$\sin(x)$")}
 \pgfmathresult

但是如果我不加载 amsmath 包,代码就没问题了。amsmath 和 TikZ 之间是否存在“冲突”?

答案1

amsmath包重新定义\sin(和其他操作符)的方式使其变得脆弱。最简单的解决方案是\sin使用etoolbox包的宏\robustify

如果你想使用pgfmath与其他运算符(以及由(正确)创建的运算符\DeclareMathOperator)一起,通常可以增强\qopname内部使用的:

\robustiy\qopname

如果你不能完全预测输入pgfmath您可以使用的宏\pgfmathIfthenelse定义为

\makeatletter
\def\pgfmathIfthenelse#1{\pgfmathifthenelse{#1}{1}{0}%
   \ifnum\pgfmathresult=1\relax\expandafter\pgfmath@firstoftwo
   \else\expandafter\pgfmath@secondoftwo\fi}%
\makeatother

这对于数学解析来说不那么灵活,但对于 TeX/text 来说效果最好。

作为一种折衷方案,使用\noexpand(这是一次性保护),尽管您需要其中三个。

来自PGF 手册,第 529 页:

"x"

这些运算符用于引用X。但是,由于每个表达式\edef在解析之前都会用 展开,因此可能需要“保护”宏(例如,字体命令,如\tt或)免受此展开的影响(例如)。理想情况下,无论如何您都应该避免使用此类宏。显然,这些运算符应谨慎使用,因为结果不太可能进行进一步计算。\Huge\noexpand\Huge

代码

\documentclass{article}
\usepackage{amsmath,tikz}
\usepackage{etoolbox}
\robustify\qopname
\makeatletter
\def\pgfmathIfthenelse#1{\pgfmathifthenelse{#1}{1}{0}%
   \ifnum\pgfmathresult=1\relax\expandafter\pgfmath@firstoftwo
   \else\expandafter\pgfmath@secondoftwo\fi}%
\makeatother
\begin{document}
\pgfmathprint{ifthenelse(1<0, "100","$\sin(x)\cos(y)\tan(z)$")}

{\pgfmathprint{ifthenelse(1<0, "100","\noexpand\noexpand\noexpand\ttfamily (x)")}}

\pgfmathIfthenelse{1<0}{\texttt{tt}}{\textsf{sf}}
\end{document}

相关内容