我macros.tex
在序言中包括了一些有用的哑宏。我想定义一个用于编写分数的宏,如果参数长度超过 1 个字符,则添加一个括号,到目前为止我所做的是:
\usepackage{xstrings}
\newcommand{\fracdivide}[3]{%
\StrLen{#2}[\arglen]%
\ifthenelse{\arglen > 1}
{%
\frac{#1\left(#2\right)}{#1#3}
}%
{%
\frac{#1#2}{#1#3}
}%
}
这会产生以下错误:
!Incomplete \iffalse; all text was ignored after line 16
。
line 16
正是我\StrLen
命令所在的行。如果我删除它(例如使用2
而不是\arglen
),它会正确编译。
为什么我会收到此错误?我该如何解决?
\text
这是一个 MWE,它似乎与的命令有关amsmath
。
\documentclass{minimal}
\usepackage{mathtools}
\usepackage{xstring}
\usepackage{ifthen}
\newcommand{\vect}[1]{\boldsymbol{\mathbf{#1}}}
\newcommand{\fracdivide}[3]{%
\StrLen{#2}[\arglen]%
\ifthenelse{\arglen > 1}
{%
\frac{#1\left(#2\right)}{#1#3}
}%
{%
\frac{#1#2}{#1#3}
}%
}
\newcommand{\partialdd}[2]{\fracdivide{\partial}{#1}{#2}}
\newcommand{\ddt}[1]{\partialdd{#1}{t}}
\begin{document}
$\ddt{f^\text{big}}$
\end{document}
答案1
您最好使用\noexpandargs
:
\documentclass{article}
\usepackage{mathtools}
\usepackage{xstring}
\usepackage{ifthen}
\newcommand{\vect}[1]{\boldsymbol{\mathbf{#1}}}
\newcommand{\fracdivide}[3]{%
\begingroup\noexpandarg
\StrLen{#2}[\arglen]%
\ifthenelse{\arglen > 1}
{%
\frac{#1(#2)}{#1#3}%
}%
{%
\frac{#1#2}{#1#3}%
}%
\endgroup
}
\newcommand{\partialdd}[2]{\fracdivide{\partial}{#1}{#2}}
\newcommand{\ddt}[1]{\partialdd{#1}{t}}
\begin{document}
\[
\ddt{f^{\mathrm{big}}} + \ddt{\Gamma}
\]
\end{document}
注意:我删除了无用(且有害)的\left
和\right
。
问题在于诸如\mathrm
或 之类的命令\text
无法在 默认执行的完整扩展中存活下来\StrLen
。\noexpandargs
这样可以避免这种情况。
但是,类似的东西\ddt{\vect{x}}
会被括起来。我不认为这是一个真正有用的宏。
带有 -version 的宏可能*
更容易使用。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}
\NewDocumentCommand{\fracdivide}{smmm}{%
\frac{#2\IfBooleanTF{#1}{(#3)}{#3}}{#2#4}%
}
\NewDocumentCommand{\partialdd}{smm}{%
\IfBooleanTF{#1}{\fracdivide*}{\fracdivide}{\partial}{#2}{#3}%
}
\NewDocumentCommand{\ddt}{sm}{%
\IfBooleanTF{#1}{\partialdd*}{\partialdd}{#2}{t}%
}
\newcommand{\vect}[1]{\boldsymbol{\mathbf{#1}}}
\begin{document}
\[
\ddt*{f^{\mathrm{big}}} + \ddt{f_1}
- \ddt{\vect{x}} + \ddt*{\vect{x}+\vect{y}}
\]
\end{document}
答案2
您尝试提取字符串的长度,需要将参数扩展为字符串。但是,f^\text{big}
事实并非如此。我们可以\detokenize
输入:
\documentclass{article}
\usepackage{mathtools,xstring}
\newcommand{\fracdivide}[3]{
\StrLen{\detokenize{#2}}[\arglen]
\ifnum\arglen>1
\frac{#1\left(#2\right)}{#1#3}
\else
\frac{#1#2}{#1#3}
\fi
}
\newcommand{\partialdd}[2]{\fracdivide{\partial}{#1}{#2}}
\newcommand{\ddt}[1]{\partialdd{#1}{t}}
\begin{document}
$\ddt{f^\text{big}}$
\end{document}
答案3
你需要这样的东西:
\def\ddt#1{{\partial\maybebraces{#1}\over\partial t}}
\def\maybebraces#1{\maybebracesA#1&}
\def\maybebracesA#1#2&{\ifx\else\left(#1#2\right)\fi}
$$\ddt{f^{\rm big}} + \ddt{\Gamma}$$
\bye
与此处的其他解决方案不同,我们不会将分数构造问题(带有“部分”符号且分母为“t”)与“可能大括号”问题混为一谈。并且(当然)不需要任何特殊软件包(也不需要 LaTeX)。