I don't have the mtpro2 fonts, so I'll use a different choice of fonts.
The idea is that Latin letters are called by themselves (that is, characters), while Greek letters are called by control sequences. So
\documentclass{article}
\usepackage{bm}
\newcommand\tensor[1]{%
\ifcat\noexpand#1\relax % check if the argument is a control sequence
\bm{#1}% probably Greek
\else
\textsf{#1}% single character
\fi
}
\begin{document}
$\tensor{X}\tensor{\Lambda}$
\end{document}

Limitation. Only one token should be given as argument to \tensor. Either \tensor{AB} or \tensor{A\Lambda} or any multiple token variation thereof would fail.
A multitoken macro based on the same idea:
\documentclass{article}
\usepackage{xparse}
\usepackage{bm}
\ExplSyntaxOn
\NewDocumentCommand\tensor{m}
{
\pluton_tensor:n { #1 }
}
\cs_new_protected:Npn \pluton_tensor:n #1
{
\tl_map_inline:nn { #1 }
{
\token_if_cs:NTF ##1 { \bm { ##1 } } { \textsf { ##1 } }
}
}
\ExplSyntaxOff
\begin{document}
$\tensor{X}\tensor{\Lambda}$
$\tensor{X\Lambda}$
\end{document}
Of course this will still fail if arbitrary input is used.
A perhaps more robust version, with a fallback for unknown tokens.
\documentclass{article}
\usepackage{xparse}
\usepackage{bm}
\ExplSyntaxOn
\NewDocumentCommand\tensor{m}
{
\pluton_tensor:n { #1 }
}
\cs_new_protected:Npn \pluton_tensor:n #1
{
\tl_map_inline:nn { #1 }
{
\pluton_tensor_inner:n { ##1 }
}
}
\cs_new_protected:Npn \pluton_tensor_inner:n #1
{
\tl_if_in:VnTF \g_pluton_latin_tl { #1 }
{
\textsf { #1 } % a Latin letter
}
{
\tl_if_in:VnTF \g_pluton_greek_tl { #1 }
{
\bm { #1 } % a Greek letter
}
{
#1 % fall back
}
}
}
\tl_new:N \g_pluton_latin_tl
\tl_new:N \g_pluton_greek_tl
\tl_gset:Nn \g_pluton_latin_tl
{
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
}
\tl_gset:Nn \g_pluton_greek_tl
{
\Gamma\Delta\Theta\Lambda\Pi\Sigma\Upsilon\Phi\Chi\Psi\Omega
}
\ExplSyntaxOff
\begin{document}
$\tensor{X}\tensor{\Lambda}$
$\tensor{X\Lambda}$
\end{document}
expl3syntax. I'll write something up soon—my emacs is modal when it updates packages. – Sean Allred Mar 16 '14 at 17:21\ifcat\noexpand#1\relax\mathbbgr{#1}\else\mathbb{#1}\fi. Since Greek letters are called with control sequences, while Latin letters are called by themselves, this might work. Of course\tensor{AB}would fail: only one token should be in the argument to\tensor. – egreg Mar 16 '14 at 17:22