这个问题有点类似于命令将句子中每个单词的首字母大写。
我想要的是构建一个仅在数学模式下使用的新命令,使用包\DeclareMathOperator
中提供的命令。amsmath
我想要定义的新命令是现有命令,\max
但其首字母大写。
请注意,命令的最终结果\max
取决于babel
包所做的更改。在我的例子中,我会将我的\DeclareMathOperator
句子后呼叫babel
。
有没有快捷的方法可以做到这一点?
如果需要的话,这是一个简单的使用示例\DeclareMathOperator
:
\DeclareMathOperator{\argmax}{\arg\max}
编辑:
我想说的是,这\DeclareMathOperator{\Max}{Max}
对我来说不是一个有效的解决方案,因为我想要的是同样的产物\max
(首字母大写即可),但考虑到产生的结果\max
取决于其他包的效果(例如,使用选项调用babel
将spanish
产生“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}
结果如下:
附录:
上述定义使得\Xyzt
行为\xyzt
类似于 限制,以内联和显示样式呈现。但是有区别:\[\sin\limits_a^b\]
或者$\sin\limits_a^b$
不是把a
和b
放进去限制位置,而\[\Sin\limits_a^b\]
和$\Sin\limits_a^b$
却如此。我会称其为非预期功能,而不是错误!如下所示:
amsmath
请注意运算符\sin
和的行为不对称\min
。对于第一个 来说\limits
什么都不做,而对于第二个 来说\nolimits
却有效。我不会将此归类为amsmath
(或者更确切地说amsopn.sty
)的错误,因为肯定有超出我能力范围的原因,但直到现在我才意识到这一点。
PS:显然上面的图片来自 ,\usepackage[spanish]{babel}
但我检查了一下,在不加载任何 babel 的情况下也观察到了完全相同的行为。还要注意 中的和\sin
分别不是通过 定义的,而只是由这些宏的某些部分代码定义的,但这是另一个不相关的细节。\min
amsopn.sty
\DeclareMathOperator
\DeclareMathOperator*
PS2:事实上,定义的运算符名称在限制方面的[spanish]{babel}
行为与类似的提供的名称不同。amsmath
答案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 包 中将其替换为:\max
letltxmacro
\max
\DeclareRobustCommand
max
Max
etoolbox
\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}