修改于egreg 的解决方案

修改于egreg 的解决方案

我希望向量变量为粗体,标量变量为普通字体。向量变量的分量应遵循标量(非粗体)惯例。为此,使用修饰符,xparse我可以定义一个命令\x

\usepackage{bm} % for \bm command
\usepackage{xparse}

\NewDocumentCommand{\x}{e{_^}}{%
    \IfValueTF{#1}{x_{#1}}{\bm x_{#1}}% plain if subscript provided, bold otherwise
    \IfValueT{#2}{^{#2}}%
}%

如果提供了下标,则打印一个简单的“x”符号,否则打印粗体“X“ 否则。

到目前为止一切顺利。当我想将其与数学重音命令结合使用时,问题就出现了,例如\bar期望结果和实际结果

有什么方法可以让命令\x(和类似定义的\y等) 与 和 朋友 “兼容” ?我之前\bar尝试过一些,但似乎没有一种组合有效。\expandafter\bar

修改于egreg 的解决方案

按照@egreg 将重音作为可选参数传递的想法,我对原始宏进行了简单的修改,这似乎也可以解决问题。 我不知道这在技术上是否合理,但为了使其更加易于阅读,我直接将可能的重音命令传递给第一个可选参数。

\NewDocumentCommand{\x}{O{} t{'} e{_^}}{% #1: accent command  #2: catch prime (')  #3: subscript  #4: superscript
    % apply optional (accent) #1
    % apply \vec if subscript #3 is empty
    \IfValueTF{#3}{%
        % check if subscript is provided but is empty
        \ifstrempty{#3}{\vec{#1{x}}}{#1{x}_{#3}}%
    }{%
        \vec{#1{x}}%
    }%
    % add superscript
    \IfValueT{#4}{^{#4}}%
    % add prime (')
    \IfBooleanT{#2}{'}%
}%

我还添加了一个 token 参数来捕获可能的素数',以便它能够正确地与下标交换(并被平等对待)。当然,它与重复的素数不兼容(在普通字体中正确输入,而\x_i'以粗体打印),但在末尾输入素数可以按预期工作。\x_i'\x_i''\x''_i

为了创建类似的命令,我将代码包装到 中\defineBoldVariableCommand{\commandName}{symbol}。下面给出的 MWE 产生以下输出:

MWE 的输出

\documentclass{article}

\usepackage{bm}% for bold math command \bm
\usepackage{etoolbox}% for \ifstrempty
\usepackage{xparse}% for \NewDocumentCommand

% ================================================================
\renewcommand{\vec}{\bm}% redefine \vec as bold math

\newcommand{\defineBoldVariableCommand}[2]{% #1: cmdname  #2: symbol
    \let#1\relax%  overwrites definition, if command already defined
    \NewDocumentCommand{#1}{O{} t{'} e{_^}}{% ##1: accent command  ##2: catch prime (')  ##3: subscript  ##4: superscript
        % apply optional (accent) ##1
        % apply \vec if subscript ##3 is empty
        \IfValueTF{##3}{%
            % check if subscript is provided but is empty
            \ifstrempty{##3}{\vec{##1{#2}}}{##1{#2}_{##3}}%
        }{%
            \vec{##1{#2}}%
        }%
        % add superscript
        \IfValueT{##4}{^{##4}}%
        % add prime (')
        \IfBooleanT{##2}{'}%
    }%
}%

\defineBoldVariableCommand{\x}{x}
% ================================================================

\begin{document}
    No (or empty) subscript: variable is bold

    \begin{tabular}{@{}ll@{}}
        $\x = \x_{}$ & \verb|\x = \x_{}|
    \\
        $\x^k$       & \verb|\x^k|
    \\
        $\x[\bar]$   & \verb|\x[\bar]|
    \\
        $\x[\bar]^k$ & \verb|\x[\bar]^k|
    \\
        $\x'$        & \verb|\x'|
    \\
        $\x[\bar]'$  & \verb|\x[\bar]'|
    \end{tabular}

    \vspace{.5cm}%
    Nonempty subscript: variable is in plain font

    \begin{tabular}{@{}ll@{}}
        $\x_i$                        & \verb|\x_i|
    \\
        $\x_i^k = \x^k_i$             & \verb|\x_i^k = \x^k_i|
    \\
        $\x[\bar]_i$                  & \verb|\x[\bar]_i|
    \\
        $\x[\bar]^k_i = \x[\bar]_i^k$ & \verb|\x[\bar]^k_i = \x[\bar]_i^k|
    \\
        $\x'_i = \x_i'$               & \verb|\x'_i = \x_i'|
    \\
        $\x[\bar]'_i = \x[\bar]_i'$   & \verb|\x[\bar]'_i = \x[\bar]_i'|
    \end{tabular}
\end{document}

编辑 #2. 更简单的解决方案

另一种可能性是,通过适当的重新定义,可以产生完全相同的结果,但工作量较少\vec

% ================================================================
\RenewDocumentCommand{\vec}{m O{} t{'} e{_^}}{%
    #2{%
        \IfValueTF{#4}{\ifstrempty{#4}{\bm}{}}{\bm}%
        {#1}%
    }%
    \IfValueT{#4}{_{#4}}%
    \IfValueT{#5}{^{#5}}%
    \IfBooleanT{#3}{'}%
}

\newcommand{\x}{\vec{x}}
% ================================================================

答案1

不要沉迷于输入诸如\bar x或 之类的内容\bm y。这样很草率,而且容易引起误导。

您所看到的内容与您输入的内容完全相同,\bar{\x}_i当然也\x无法看到_

我可以提供一个命令,期待看到主字母是否需要用重音符号来修饰。

\documentclass{article}
\usepackage{amsmath}
\usepackage{bm}

\NewDocumentCommand{\vv}{moe{_^}}{%
  \IfNoValueTF{#3}{%
    \makevv{\bm{#1}}{#2}%
  }{%
    \makevv{#1}{#2}_{#3}%
  }%
  \IfValueT{#4}{^{#4}}%
}

\NewDocumentCommand{\makevv}{mm}{%
  \StringCase{#2}{
    {h}{\hat}
    {c}{\check}
    {d}{\dot}
    {dd}{\ddot}
    {ddd}{\dddot}
    {b}{\bar}
  }{#1}%
}

\ExplSyntaxOn
\cs_set_eq:NN \StringCase \str_case:nn
\ExplSyntaxOff

\NewDocumentCommand{\x}{}{\vv{x}}

\begin{document}

$\vv{y}+\x$

$\vv{y}_i+\x_i$

$\vv{y}[d]+\x[b]$

$\vv{y}[dd]_i+\x[b]_i$

\end{document}

在此处输入图片描述

您可以在代码中看到重音符号的缩写。

相关内容