使用数学模式子索引错误的新命令

使用数学模式子索引错误的新命令

我已经定义了以下命令

\newcommand{\gsubselector}[2]{$s_{#1,#2}$}

并且我通过以下方式从文档中调用它:

... \gsubselector{a,i} : \gsubselector{b,j} there is ...

我期望输出如下:

... $s_{a,i}$ : $s_{b,j}$ there is ...

但是,从我使用“pdfTex”得到的输出 pdf 来看,输出对应于以下代码:

... $s_{a,i,:}$ $s_{b,j,t}$ here is ...

我的定义有误吗?谢谢!

答案1

您只需

\newcommand{\gsubselector}[1]{$s_{#1}$}

因为诸如

\gsubselector{a,i}

a,i作为的唯一参数\gsubselector,因此宏替换将给出

$s_{a,i}$

按要求。

但是,我认为这不是一个好的定义。在您的代码片段中,您输入

... \gsubselector{a,i} : \gsubselector{b,j} there is ...

并且此输入可能会导致冒号位于行首,这肯定是不受欢迎的。

我的印象是,这个冒号是数学公式的一部分。我认为最好将数学放在适当的环境中,因此

\newcommand{\gsubselector}[1]{s_{#1}}

... $\gsubselector{a,i} : \gsubselector{b,j}$ there is ...

因此冒号将被正确解释为数学关系符号。TeX 仍有可能断行冒号。如果发生这种情况,请尝试\nolinebreak在冒号后添加

... $\gsubselector{a,i} :\nolinebreak \gsubselector{b,j}$ there is ...

TeX 有可能找到不同的段落拆分方法;如果不能,那么这是一个完善文章和重新措辞的好机会。好的排版需要人工帮助机器。

不要\nolinebreak在每个情况下都添加:TeX 通常不愿意在关系符号后换行,只有当替代方案在它看来更糟糕时才会这样做。但换行不仅仅是分割长行并拉伸或缩小单词间距:语义考虑也很重要,而机器对此一无所知。

答案2

尝试

 \newcommand\gsubselector#1{\expandafter\GSUBelector#1!!} 
 \def\GSUBelector#1,#2!!{\ensuremath{s_{#1,#2}}}

如果它不能帮助创造一个完全的例子。

相关内容