![修改于egreg 的解决方案](https://linux22.com/image/470476/%E4%BF%AE%E6%94%B9%E4%BA%8Eegreg%20%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.png)
我希望向量变量为粗体,标量变量为普通字体。向量变量的分量应遵循标量(非粗体)惯例。为此,使用修饰符,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 产生以下输出:
\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}
您可以在代码中看到重音符号的缩写。