我已经定义了以下命令
\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}}}
如果它不能帮助创造一个完全的例子。