使用 \ensuremath 定义可在数学模式内外使用的宏的正确方法

使用 \ensuremath 定义可在数学模式内外使用的宏的正确方法

基于此解决方案与定义宏相关我想出了这个宏来帮助我定义一个可以在数学模式之内或之外使用的宏。

示例按原样运行,符合我的要求。但是,此解决方案要求我不是$$第二个参数放在\DefineNamedFunction宏中。我希望能够包含 $$,或者不包含它。

一个解决方案是进行修改\DefineNamedFunction以删除$$使用包中包含的宏调用xstring,但是对我来说这感觉像是一种黑客攻击,并且我认为可能有一种更干净的 TeX 方法来做到这一点。

总结一下:我该如何进行更改,\DefineNamedFunction以便能够使用对这个宏的注释和未注释的调用,并且仍然能够在数学模式内部和外部使用定义?

\documentclass{article}

\usepackage{amsmath}
\usepackage{xcolor}

\newcommand{\DefineNamedFunction}[2]{% {FunctionName}{FunctionExpression}
    \expandafter\providecommand\expandafter{\csname#1\endcsname}{\textcolor{red}{\ensuremath{#2}}}%
}

\begin{document}

\DefineNamedFunction{FunctionF}{y = 2 \sin x}
%\DefineNamedFunction{FunctionF}{$y = 2 \sin x$}

I can use FunctionF inside math mode as $\FunctionF$,
but can also use this outside of math mode as \FunctionF.

\end{document}

答案1

大概

\ensuremath{\textcolor{red}{#2}}

就是你所需要的,因为\textcolor可以在文本和数学中使用。完整的定义是

\newcommand{\DefineNamedFunction}[2]{% {FunctionName}{FunctionExpression}
    \expandafter\providecommand\csname#1\endcsname
      {\ensuremath{\textcolor{red}{#2}}}%
}
...
\DefineNamedFunction{FunctionF}{y=2\sin x}
$\FunctionF$ and \FunctionF

样本

我还删除了需要另一个的括号\expandafter,但这不是问题。

当然,你不能打电话

\DefinedNamedFunction{FunctionFF}{$y=x$}

我不知道你为什么想要它。但无论如何,有一个简单的解决方案

\newcommand{\DefineNamedFunction}[2]{%
  \expandafter\providecommand\csname#1\endcsname
    {\ensuremath{\begingroup\color{red}\DNFnorm#2\endgroup}}}
\makeatletter
\def\DNFnorm{\@ifnextchar$\DNFnormi{}}
\def\DNFnormi$#1${#1}
\makeatother

$通过删除前后的标记(如果存在)来对输入进行“标准化” 。

\begingroup\color{red}...\endgroup子公式中的空格一起参与行中空格的拉伸和收缩。

答案2

\documentclass{article}
\usepackage{amsmath}
\usepackage{xcolor}
\makeatletter
\def\DefineNamedFunction#1#2{\expandafter\DefineNamedFunction@i#1\@nil#2\@nil}
\def\DefineNamedFunction@i#1\@nil{%
  \@ifnextchar${\DefineNamedFunction@ii{#1}}{\DefineNamedFunction@iii{#1}}}
\def\DefineNamedFunction@ii#1$#2$\@nil{%
  \@namedef{#1}{\ifmmode\textcolor{red}{#2}\else\textcolor{red}{$#2$}\fi}}
\def\DefineNamedFunction@iii#1#2\@nil{%
  \@namedef{#1}{\ifmmode\textcolor{red}{#2}\else\textcolor{red}{$#2$}\fi}}
\makeatother

\DefineNamedFunction{FunctionF}{y = 2 \sin x}
\DefineNamedFunction{FunctionFF}{$y = 2 \sin x$}
\begin{document}    
I can use \FunctionF\ inside math mode as $\FunctionF$,
but can also use this outside of math mode as 
$\FunctionFF$ and \FunctionFF.

\end{document}

相关内容