我试图为预期值运算符编写一个新命令,这样如果其参数是大写字母,它将用一个\mathrm
字母替换它,例如从E(X)
到E(\mathrm{X})
;并将按原样扩展小写字母。对于单个字母,我可以简单地执行以下操作
\documentclass{article}
\usepackage{mathtools}
\newcommand{\E}[1]{\mathrm{E}
\lparen
\ifnum `#1=\uccode`#1
\mathrm{#1}
\else #1
\fi
\rparen}
\begin{document}
\[\E{X}\]
\end{document}
但是,如果输入的是一系列字符,比如说e^{tX}
,这种方法就会出错。我想知道是否有一种方法可以检查参数的“大写”并进行相应的修改。
评论:此命令仅用于表示随机变量,因此我仍然希望在其他地方使用大写字母斜体。
答案1
\documentclass{article}
\makeatletter
\newcommand{\change@uppercase@math}{%
\count@=`\A
\loop
\mathcode\count@\count@
\ifnum\count@<`\Z
\advance\count@\@ne
\repeat}
\newcommand{\E}[1]{
\mathrm{E}
(\begingroup\change@uppercase@math#1\endgroup)
}
\makeatother
\begin{document}
$\E{X}+\E{e^{tX}}$
\end{document}
当然很慢。我坚持我的观点:最好把你想要的东西标记直立起来。
答案2
如果您想要全部大写罗马字母,您可以执行以下操作(或者如果需要,您可以在本地执行此操作)
\documentclass{article}
\makeatletter
\count@`A
\loop
\mathcode\count@\count@
\ifnum\count@<`Z
\advance\count@\@ne
\repeat
\makeatother
\begin{document}
$abc+ABC+def+DEF+ghijklmnop+GHIJKLMNOP$
$qQrRsStTuUvVwWxXyYzZ$
\end{document}
答案3
我没有测试过,但以下内容(与 unicode 引擎不兼容)应该与任意数学字体上下文兼容。特别是它不假设字母表\mathrm
会选择数学系列0
。命令\E
在发出\mathrm
其参数之前,首先使所有小写字母在组中对数学字母表不响应。包xint
用于更轻松地计算(可扩展)。
\documentclass{article}
% not compatible with unicode engines
\usepackage{xint}
\makeatletter
% this macro will make the lowercase letter unresponsive to
% math changing alphabets; and this is compatible to arbitrary
% math font setup.
%
\def\@makeunreactive #1{%
\mathcode`#1=\xintRem{\the\mathcode`#1}{4096}
}
\newcommand*\E[1]{%
\begingroup
\@tfor\x:=\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\do
{\expandafter\@makeunreactive\x}%
\mathrm{#1}%
\endgroup
}
\makeatother
\begin{document}
$\E{abcdefghijklmnopqrestuvwxyzABCDEFGHIJKLMNOPQRESTUVWXYZ}$
\end{document}