我想输入时间导数,例如,$ \frac{\partial x}{\partial t} = f(x,t) $
以及空间梯度,例如$ \frac{\partial y}{\partial x} = k y $
为了使代码可读并避免重复输入,我找到了一个使用该包的\partial
宏\pder
(我在序言中提到过)xparse
\DeclareDocumentCommand{\pder}{ O{} O{} m }{\frac{\partial^{#2}#1}{\partial#3^{#2}}}
然而,\pder{t}{x}
产生的输出如下
而不是产生的期望输出\frac{\partial x}{\partial t}
是
如何声明一个数学宏,该宏接受分子和分母的变量但不在它们之间留空格?
附言:我不知道为什么 Tex.SX 不呈现 $..$ 内输入的内容。如果有人知道我做错了什么,请告诉我,我会修复它。
答案1
不要重新发明轮子:已经有一个esdiff
包可以简化以莱布尼茨符号(偏导数或非偏导数)排版导数。此外,它可以自动确定交叉导数的导数顺序,并处理求值点:
\documentclass{article}%
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{newtxtext, newtxmath}
\usepackage{esdiff}
\begin{document}
\[ \diffp*{u}{t}{\mkern2mu t = 0}\qquad \diffp{u}{t x}\qquad \diffp{u}{{t^2}x} \]%
\end{document}
答案2
你\pder
只需要一个强制参数,这样你就有了\pder{t}
,然后{x}
使用未使用的括号组
用两个参数定义它
\DeclareDocumentCommand{\pder}{ O{} O{} m m}%
{\frac{\partial^{#2}#1#4}{\partial#3^{#2}}}
答案3
这是我的解决方案。它可以计算差异。
\documentclass[17pt]{extarticle}
\usepackage{xparse}
\makeatletter
\newcounter{pdiff@total}
\DeclareDocumentCommand\linefrac{mm}
{\left.#1\middle\slash{#2}\right.}
\NewDocumentCommand\pdiff{s o >{\SplitList{,}} m}%
{\IfBooleanTF{#1}{\let\@tempa\linefrac}{\let\@tempa\frac}%
\setcounter{pdiff@total}{0}%
\ProcessList{#3}{\pdiff@c}%
\@tempa%
{\partial \ifnum\thepdiff@total >1\relax ^{\arabic{pdiff@total}} \fi%
\IfValueT{#2}{#2}}%
{\ProcessList{#3}{\pdiff@vars}}}
\NewDocumentCommand\pdiff@c{> { \SplitArgument { 1 } { * } } m}{\@pdiff@c#1}
\NewDocumentCommand\@pdiff@c{m G{1}}{\addtocounter{pdiff@total}{#2}}
\NewDocumentCommand\pdiff@vars{> { \SplitArgument { 1 } { * } } m}{\@pdiff@vars#1}
\NewDocumentCommand\@pdiff@vars{m g}{\mathinner{\partial #1 \IfValueT{#2}{^ {#2}}}}
\makeatother
\begin{document}
\[ \pdiff{x} \quad \pdiff[f(x)]{x*2,y*95,z*4} \quad \pdiff*[f(\vec r)]{\vec r*5}\]
\end{document}