我定义了一个带有可变参数的宏,如下所示,它运行良好。
$\un{N}$=>【否】
$\un{J}{s}$=>[焦耳/秒]

\标记字母\新命令\n[1]{\@ifnextchar\bgroup{\un@双重{#1}}{\un@单个{#1}}}\new命令\un@单个[1] {{\\boldsymbol{\left[\mathrm{#1}\right]}\}}\new命令\un@双重[2] {{\\粗体符号{\left[\mathrm{\dfrac{\mathrm{#1}}{\mathr{#2}}}\right]}\}}\制造者

同样,我定义了另一个宏来表示部分微分。但它不起作用。预期结果如下:
\pfrac{x}{y}=>?x/?y
\pfrac{x}{y}{z}=>导数/导数z(导数x/导数y)

\标记字母\新命令\pfrac[1]{\@ifnextchar\bgroup{\pfrac@三{#1}}{\pfrac@二{#1}}}\new命令\pfrac@二[2] {{\压裂{\部分#1}{\部分#2}}\new命令\pfrac@三[3] {{\frac{\partial}{\paratil#3}\left(\frac}\partial#1}{\protial#2}\right)}}\制造者

如何修复后一个新命令?

2
  • 1
    这是可能的(xparse(扩展)包甚至仍然支持不推荐的用于定义可选的选项{}参数),但您不应该这样定义命令,因为它们破坏了所有的latex语法约定。可选参数应在[]{}。不会破坏latex约定的语法将是\un{J}[秒],\un{j/s} \un{j,s}, ... 评论 5月25日10:55
  • 1
    所以你想要\pfrac ABC公司与…的结果不同\pfrac AB{C}? 那怎么办\pfrac ABC公司\pfrac AB C公司? (\@ifnextchar使用空间标记…) 评论 5月25日11:44

3个答案

重置为默认值
5

让我们用手展开它,看看会发生什么。起始时间:

\pfrac{x}{y}

替换后x个进入之内#1,我们得到:

\@ifnextchar\b组{\pfrac@三{x} }{\pfrac@二{x} }{y}

自从内容之后\@ifnextchar\b组{\pfrac@三{x} }{\pfrac@二{x} }{y}(y)特别是它从{,因此选择了第一个分支,一段时间后,它将变为:

\pfrac@三{x} {y}(y)

哎呀。不幸的是,很难直接观察这个过程(解开包装?)很难找到文档(手动运行程序)。

如何修复:

\标记字母\新命令\pfrac[2]{\@ifnextchar\bgroup{\pfrac@三{#1}{#2}}{\pfrac@二{#1}{#2}}}\new命令\pfrac@二[2] {\压裂{\部分#1}{\部分#2}}\new命令\pfrac@三[3] {\frac{\partial}{\paratil#3}\left(\frac}\partial#1}{\protial#2}\right)}\制造者

我删除了多余的大括号和空格(尽管在这种情况下它们看起来大多是无害的)。

0

您只需要两个宏

\newcommand\pfrac[2]{%\@ifnextchar\b组%{\pfrac@三{#1}{#2}}%{\压裂{\部分#1}{\部分#2}%}\new命令\pfrac@三[3]{%\压裂{\部分}{\部分#3}\左(\pfrac{#1}{#2}\右)%}

但最好还是保留可选参数

\新建文档命令{\xpfrac}{omm}{%\IfValueTF{#1}{\frac{\partial}{\ partial#1}\左(\xpfrac{#2}{#3}\右)}{\压裂{\部分#2}{\部分#13}}}

请注意,可以将可选参数放在末尾毫摩尔如果你愿意\xpfrac{x}{y}[z]而不是\xpfrac[z]{x}{y}.

例子:

\文档类{article}\标记字母\新命令\pfrac[2]{%\@ifnextchar\b组%{\pfrac@三{#1}{#2}}%{\压裂{\部分#1}{\部分#2}%}\new命令\pfrac@三[3]{%\压裂{\部分}{\部分#3}\左(\pfrac{#1}{#2}\右)%}\制造者\新建文档命令{\xpfrac}{omm}{%\IfValueTF{#1}{\frac{\partial}{\ partial#1}\左(\xpfrac{#2}{#3}\右)}{\压裂{\部分#2}{\部分#13}}}\开始{文档}$\pfrac{x}{y}$$\pfrac{x}{y}{z}$$\xpfrac{x}{y}$$\xpfrac[z]{x}{y}$\结束{文档}

例子

0
0

我的建议是不要走“可变宏观”的道路。在您的用例中,语法应该是

\pfrac{x}{y}\pfrac[z]{x}{y}

因为z(z)将出现第一在输出中。可替换地,\pfrac{x}{y}[z],但这不太吸引人。

\文档类{article}\使用包{amsmath}\NewDocumentCommand{\pfrac}{omm}{%\IfValueT{#1}{\分数{\部分}{\部分#1}\!\左(}%\压裂{\部分#2}{\部分3}%\IfValueT{#1}{\right)}%}\开始{文档}\[\pfrac{x}{y}\qquad\pfrac[z]{x}{y}\]\开始{center}%以测试文本样式$\pfrac{x}{y}\qquad\pfrac[z]{x}{y}$\结束{中心}\结束{文档}

在此处输入图像描述

使用替代语法(相同的输出):

\文档类{article}\使用包{amsmath}\新建文档命令{\pfrac}{mmo}{%\IfValueT{#3}{\分数{\部分}{\部分#3}\!\左(}%\压裂{\部分#1}{\部分#2}%\IfValueT{#3}{\右)}%}\开始{文档}\[\pfrac{x}{y}\qquad\pfrac{x}{y}[z]\]\开始{center}%以测试文本样式$\ffrac{x}{y}\qquad\pfrac{x}{y}[z]$\结束{中心}\结束{文档}

第一种方案更好,因为在第二种情况下,你需要小心,以防括号在没有可选参数的情况下跟随结构。

你必须登录回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.