将数学命令的首字母大写的命令

将数学命令的首字母大写的命令

这个问题有点类似于命令将句子中每个单词的首字母大写

我想要的是构建一个仅在数学模式下使用的新命令,使用包\DeclareMathOperator中提供的命令。amsmath

我想要定义的新命令是现有命令,\max但其首字母大写。

请注意,命令的最终结果\max取决于babel包所做的更改。在我的例子中,我会将我的\DeclareMathOperator句子呼叫babel

有没有快捷的方法可以做到这一点?

如果需要的话,这是一个简单的使用示例\DeclareMathOperator

\DeclareMathOperator{\argmax}{\arg\max}

编辑:

我想说的是,这\DeclareMathOperator{\Max}{Max}对我来说不是一个有效的解决方案,因为我想要的是同样的产物\max(首字母大写即可),考虑到产生的结果\max取决于其他包的效果(例如,使用选项调用babelspanish产生“máx”\max而不是“max”)。所以,它并不像看起来那么简单……

答案1

这不是一种通用的解决方案,因为它假设运营商名称中的第一个字母是唯一的。它们\relax可能有点可选,我总是搞不清楚什么时候应该放一些,什么时候不应该放一些 ;-)

\documentclass{amsart}
\usepackage[english,spanish]{babel}
\makeatletter
\newcommand\Max{\@tempcnta=\mathcode`\m\relax
\mathcode`\m=\mathcode`\M\max\mathcode`\m=\@tempcnta\relax}
\makeatother

\begin{document}
  \begin{equation*}
    \max_0^\infty = \Max_0^\infty \Max\nolimits_0^\infty m M 
  \end{equation*}
\selectlanguage{english}
  \begin{equation*}
    \max_0^\infty = \Max_0^\infty \Max\nolimits_0^\infty m M
  \end{equation*}
\end{document}

感谢 egreg 的评论。在暂时将他的简化(对我最初提案的代码的简化)纳入我现在提出的扩展之后,我现在回到了原来的东西,但也纳入了 所指出的后续改进egreg

适用与上述相同的限制(运营商名称应该只包含一次其首字母)。

\documentclass{amsart}
\usepackage[english,spanish]{babel}
\pagestyle{empty}

\makeatletter

\def\Tr@nsmogrify#1#2.{\expandafter\newcommand\csname #1#2\endcsname
{\mathchardef\Tr@ns@temp=\mathcode\lccode`#1\relax
\mathcode\lccode`#1=\mathcode`#1\lowercase{\csname#1#2\endcsname}%
\mathcode\lccode`#1=\Tr@ns@temp\relax}}

\@for\x:=Sin,Cos,Max,Min,Lim,Limsup,Liminf,Inf\do{%
\expandafter\Tr@nsmogrify \x.}

\makeatother

\begin{document}

\thispagestyle{empty}
\noindent
\begin{minipage}{.5\linewidth}
  \begin{align*}
\min_0^\infty &= \Min_0^\infty\\
\min\nolimits_0^\infty &= \Min\nolimits_0^\infty\\
\max_0^\infty &= \Max_0^\infty\\
\lim_{x\to\infty} &= \Lim_{x\to\infty}\\
\liminf_{x\to\infty} &= \Liminf_{x\to\infty}\\
\limsup_{x\to\infty} &= \Limsup_{x\to\infty}\\
\inf_{x\in A} &= \Inf_{x\in A}\\
\sin^2 x +\cos^2 x  &= \Sin^2 x +\Cos^2 x \\
\limsup_{x\to\infty} &= \Limsup_{x\to\infty}\\
m,M,l,L&,s,S,c,C
  \end{align*}
\end{minipage}
\begin{minipage}{.5\linewidth}
\selectlanguage{english}%
  \begin{align*}
\min_0^\infty &= \Min_0^\infty\\
\min\nolimits_0^\infty &= \Min\nolimits_0^\infty\\
\max_0^\infty &= \Max_0^\infty\\
\lim_{x\to\infty} &= \Lim_{x\to\infty}\\
\liminf_{x\to\infty} &= \Liminf_{x\to\infty}\\
\limsup_{x\to\infty} &= \Limsup_{x\to\infty}\\
\inf_{x\in A} &= \Inf_{x\in A}\\
\sin^2 x +\cos^2 x  &= \Sin^2 x +\Cos^2 x \\
\limsup_{x\to\infty} &= \Limsup_{x\to\infty}\\
m,M,l,L&,s,S,c,C
  \end{align*}
\end{minipage}
\end{document}

结果如下:

PNG 图像包含英语和西班牙语运算符,且首字母大写

附录:

上述定义使得\Xyzt行为\xyzt类似于 限制,以内联和显示样式呈现。但有区别:\[\sin\limits_a^b\]或者$\sin\limits_a^b$不是ab放进去限制位置,而\[\Sin\limits_a^b\]$\Sin\limits_a^b$却如此。我会称其为非预期功能,而不是错误!如下所示:

限制的不同行为

amsmath请注意运算符\sin和的行为不对称\min。对于第一个 来说\limits什么都不做,而对于第二个 来说\nolimits 却有效。我不会将此归类为amsmath(或者更确切地说amsopn.sty)的错误,因为肯定有超出我能力范围的原因,但直到现在我才意识到这一点。

PS:显然上面的图片来自 ,\usepackage[spanish]{babel}但我检查了一下,在不加载任何 babel 的情况下也观察到了完全相同的行为。还要注意 中的和\sin分别不是通过 定义的,而只是由这些宏的某些部分代码定义的,但这是另一个不相关的细节。\minamsopn.sty\DeclareMathOperator\DeclareMathOperator*

PS2:事实上,定义的运算符名称在限制方面的[spanish]{babel}行为与类似的提供的名称不同。amsmath

带有 \limits 的运算符名称示例

答案2

不可能简单地将首字母大写。有两种策略可用于定义新的运算符。我将针对三种语言的文档举例说明。

策略1

为形式必须改变的语言定义默认字符串和辅助字符串。

\documentclass{article}
\usepackage{amsmath}
\usepackage[english,italian,spanish]{babel}

% the new operator
\DeclareMathOperator{\Max}{\Maxname}
% default string
\newcommand{\defaultMaxname}{Max}
\let\Maxname\defaultMaxname 
% English and Italian want "Max"
% Spanish wants a different name, "Máx"
\newcommand{\spanishMaxname}{M\acute{a}x}
\addto\extrasspanish{\let\Maxname\spanishMaxname}
\addto\noextrasspanish{\let\Maxname\defaultMaxname}
%%%

\begin{document}
Esto es $\Max$

\begin{otherlanguage}{english}
This is $\Max$
\end{otherlanguage}

\selectlanguage{italian}    
Questo \`e $\Max$

\end{document}

输出将是

这是 Máx
这是 Max
这是 Max

但是,otherlanguage*不会\foreignlanguage改变行为,在这些情况下,您将获得默认语言(在本例中为西班牙语)的“Máx”。

策略2

明确定义您计划使用的所有语言的字符串。

\documentclass{article}
\usepackage{amsmath}
\usepackage[english,italian,spanish]{babel}


\DeclareMathOperator*{\Max}{\Maxname}
\newcommand{\englishMaxname}{Max}
\newcommand{\italianMaxname}{Max}
\newcommand{\spanishMaxname}{M\acute{a}x}

\let\Maxname\englishMaxname % default
\addto\extrasenglish{\let\Maxname\englishMaxname}
\addto\extrasitalian{\let\Maxname\italianMaxname}
\addto\extrasspanish{\let\Maxname\spanishMaxname}

\begin{document}
Esto es $\Max$

\begin{otherlanguage*}{english}
This is $\Max$
\end{otherlanguage*}

\foreignlanguage{italian}{Questo \`e $\Max$}

\end{document}

输出将是

这是 Máx
这是 Max
这是 Max

与以前完全一样,但otherlanguage*也会\foreignlanguage尊重语言设置。


答案3

我更喜欢一个清晰的定义\Max

\documentclass{article}
\usepackage{amsmath}

\DeclareMathOperator*{\Max}{Max}

\begin{document}
\begin{gather*}
\max_0^\infty = \Max_0^\infty
\end{gather*}
\end{document}

结果

补丁解决方案

此示例通过从via 包\Max复制定义来定义,因为是通过 定义的。然后在内部宏 via 包 中将其替换为:\maxletltxmacro\max\DeclareRobustCommandmaxMaxetoolbox

\documentclass{article}
\usepackage{amsmath}
\usepackage{letltxmacro}
\usepackage{etoolbox}

\LetLtxMacro\Max\max
\patchcmd\Max{max}{Max}{}{}

\begin{document}
\begin{gather*}
\max_0^\infty = \Max_0^\infty
\end{gather*}
\end{document}

更新:带有西班牙口音

\documentclass[fleqn]{article}
\usepackage[english,spanish]{babel}
\usepackage{amsmath}

\makeatletter
\DeclareMathOperator*{\en@Max}{Max}
\DeclareMathOperator*{\es@Max}{M\es@op@ac{a}x}
\addto\es@operators{%
  \let\Max\es@Max
}
\providecommand*{\nomathspanish}{}
\addto\nomathspanish{%
  \let\Max\en@Max
}
\makeatother

\begin{document}

Spanish:
\begin{gather*}
\max_0^\infty = \Max_0^\infty
\end{gather*}

\selectlanguage{english}
English:
\begin{gather*}
\max_0^\infty = \Max_0^\infty
\end{gather*}

\end{document}

结果

相关内容