需要一个新的命令来修改其参数中的大写字母

需要一个新的命令来修改其参数中的大写字母

我试图为预期值运算符编写一个新命令,这样如果其参数是大写字母,它将用一个\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}

大写直立

相关内容