使用 xstring 的 iffalse 不完整

使用 xstring 的 iffalse 不完整

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&#2&#1\else\left(#1#2\right)\fi}


$$\ddt{f^{\rm big}} + \ddt{\Gamma}$$

\bye

与此处的其他解决方案不同,我们不会将分数构造问题(带有“部分”符号且分母为“t”)与“可能大括号”问题混为一谈。并且(当然)不需要任何特殊软件包(也不需要 LaTeX)。

相关内容