编辑:
我解决了我的问题,但并没有直接解决原始问题。不过,我认为我的经历可能对某些人有帮助。
我没有直接解决加粗问题,而是退后一步,研究“真正”的问题。我已经定义了太多命令,以至于符号的改变让我想要改变\bm
工作方式,而不是改变我的格式化宏。
所以问题就变成了:我如何才能以一种将来容易改变的方式定义排版和符号宏?(我已经接受了我必须忍受修复我已经造成的混乱的事实。)
原始问题:
是否有一种方法或命令可以仅将非下标或非上标字符加粗?
我有一个文档,其中有许多使用示例中所示模式定义的命名变量。我希望能够编写类似的代码,$\bmnonscript{\namedvariable{i,j}}$
并使其产生与相同的结果${\bm{\namedvariable{}}}_{i,j}$
。
编辑:我收到的初步建议是简单地从中排除下标\namedvariable
,但这是不可能的,因为有些变量是用下标定义的总是现在。MWE 已更新。请参阅\varwithsub
梅威瑟:
\documentclass{amsart}
\usepackage{bm}
\usepackage{etoolbox}
\newcommand{\namedvariable}[1]{v_{#1}}
\newcommand{\varwithsub}[1][]{\ifstrempty{#1}{\nu_{sub}}{\nu_{sub, #1}}}
\begin{document}
Currently works as desired: \\
$\namedvariable{}$ \\
$\namedvariable{i}$ \\
$\bm{\namedvariable{}}$ \\
But I want \textbackslash bm\{\textbackslash namedvariable\{i, j\}\} to produce\\
${\bm{\namedvariable{}}}_{i,j}$\\
not\\
$\bm{\namedvariable{i, j}}$.\\
We want to be able to deal with variables that are defined with a subscript.\\
$\varwithsub$\\
$\varwithsub[1]$
\end{document}
答案1
简短的
经过一番挖掘和大量的努力尝试在我的条件定义中包含环境和范围检查,试图以某种方式传递主角,\bm
然后将下标粘贴到处理过的粗体字符之后,我不得不接受一个事实,即重做整个文档会更容易。
我不知道这是否是 StackExchange 上的正确程序,但我将回答我自己的问题,而不是回答原始问题,而是使用简化的示例来说明我如何解决核心问题。然后我将编辑问题以反映这一点,希望其他和我一样缺乏经验的人将来能发现这一点,避免我给自己带来的麻烦。
主要教训
在尝试“将内容与格式分离”时,请考虑您的分离方法是否符合此操作方式的实际目标。目标,即在需要更改格式时节省时间。
更少的输入$\neq$更容易改变格式。
完整故事
这里发生的事情以及我提出这个问题的动力是,我从几个变量定义和符号约定开始:
\newcommand{\xraw}{\tilde{x}}
\newcommand{\xnormed}{x}
\newcommand{\xapprox}{\hat{x}}
如果事情就这样结束了,我回头再看时仍会觉得这是一个可以接受的决定。这样我就可以写下类似这样的东西$\xnormed$ is the result of applying some norm to $\xraw$
,如果有什么事情意味着我的符号必须改变,我的文档主体不会受到影响,只有包含上述所有定义的文件才会受到影响。
然而,问题就出在这里(我不知道)。我确信我已经将内容与格式分开,我继续根据需要添加定义。
\newcommand{\yraw}{\tilde{y}}
\newcommand{\ynormed}{y}
\newcommand{\yapprox}{\hat{y}}
由于我每次只添加一个定义,所以我没有意识到复制粘贴原始定义并在每个定义中编辑一两个字符花了多少时间。很快我就有了数百行定义,其中包括看起来像
\DeclareBoldMathCommand{\bx}{x}
\newcommand{\bxraw}{\tilde{\bx}}
为了每一个变量。我为拉丁字母表的每个字母(一些希腊字母)设置了 3-10 个命令,大多数都有大写和小写变体。然后我开始包括条件定义:
\newcommand{\pitchsb}[1][]{
\ifstrempty{#1}
{\theta_{sb}}
{\theta_{sb, #1}}
}
上面的内容对我来说仍然很好,直到我想要一个粗体版本:
\newcommand{\bpitchsb}[1][]{
\ifstrempty{#1}
{\btheta_{sb}}
{\btheta_{sb, #1}}
}
按照我之前的模式,这是可行的方法,但这种需要恰好与我必须改变符号标准相吻合,然后我意识到我必须改变数百容易出错的定义(当你编辑本质上相同的内容 100 次时,很容易出错)。这种认识意味着我不想进一步重复定义,因为我现在已经意识到这样做会使我的文档格式调整起来非常痛苦。所以我问(很严肃),不是如何修复我的文档,而是如何修改行为以\bm
与我已经拥有的内容配合。
确实,对我来说,花几个小时编写正则表达式来搜索并用更好的系统替换我的混乱情况比弄清楚如何继续处理我的错误更容易。
我想用粗体来表示矢量,因此我\vec
为此重新定义了,并替换了文档中的所有内容。\xraw
变成了\raw{x}
,\bxnormedapprox
变成了\approx{\normed{\vec{x}}}
。 这需要更多的输入,但仍然将内容与格式分开。
故事的道德启示
\newcommad{\raw}[1]{\tilde{#1}}
\necommand{\araw}{\tilde{a}}
比 100 行、 、 ...更容易更改,\necommand{\braw}{\tilde{b}}
即使两个变体在内容和文本格式之间有相同数量的划分:Consider the unnormalised apple variable \raw{a}
vs.Consider the unnormalised apple variable \araw
。\raw{\vec{x}}_{\text{bloop}}
可能比输入更多\bxrawbloop
,但它更易于维护。
我认为在这里回答并分享我的经验比删除问题更好,因为我怀疑这不是第一次或最后一次有人这样浪费时间,而且我的经验对于那些原本会做与我相同事情的人来说可能是有价值的。