我有一个问题:
\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}