根据命令名称创建新命令

根据命令名称创建新命令

我有这个想法,它可以节省我写论文的大量时间。事情是这样的:我需要排版大量包含向量和矩阵的方程式。我希望我的向量用粗体小写,矩阵用粗体大写。对于向量和矩阵,我在序言中定义了以下内容:

\renewcommand{\v}[1]{\ensuremath{\boldsymbol{#1}}}
\newcommand{\m}[1]{\ensuremath{\boldsymbol{\uppercase{#1}}}}

在上下文中,我使用 \v{x} 来排版向量 x 等等。

然而,如果能够排版\vx来创建相同的向量,那不是很好吗?X。然后,如果我写的是矢量AbC,我就可以写\va\vb然后\vc

这在 LaTeX 中可能吗?

答案1

如果在向量和矩阵中大量使用粗体数学斜体,最好的解决方案是定义一种新的符号字体:

\DeclareMathAlphabet{\mathbmit}{OML}{cmm}{b}{it}

然后做

\renewcommand{\vec}[1]{\mathbmit{#1}}
\let\matr\vec

(或者,用“男子汉程序员的方式”,\renewcommand{\vec}{\mathbmit})。如果一个矩阵被称为“A”,那么在我看来,将其输入为是没有意义的\matr{a}

诸如 等\va的缩写\vb定义,但最大的风险是在短时间内忘记命令的含义。如果你真的想要遵循这条路径,那么方法如下:

\documentclass{article}

\DeclareMathAlphabet{\mathbmit}{OML}{cmm}{b}{it}
\renewcommand{\vec}[1]{\mathbmit{#1}}
\let\matr\vec

\makeatletter
\@tfor\next:=abcdefghijklmnopqrstuvwxyxz\do
 {\begingroup\edef\x{\endgroup
    \noexpand\@namedef{v\next}{\noexpand\vec{\next}}%
  }\x}
\@tfor\next:=ABCDEFGHIJKLMNOPQRSTUVWXYZ\do
 {\begingroup\edef\x{\endgroup
    \noexpand\@namedef{m\next}{\noexpand\matr{\next}}%
  }\x}
\makeatother

\begin{document}
This is a vector $\vx$ and this is a matrix $\mA$.

This is a vector $\vec{x}$ and this is a matrix $\matr{A}$.

Also $\matr{\Gamma}$ works.
\end{document}

在我看来,使用\ensuremath是错误的,因为这些是数学实体,所以它们应该始终处于明确的数学模式。

在此处输入图片描述

相关内容