我正在尝试改编 Martin Scharrer 的解决方案常见缩写的宏能够在数学模式下使用它们。是的,我意识到我即将招致一些批评,说我应该只使用\text{}
,但我更喜欢宏来帮我思考。
我有下面三个不同版本的
\ie
宏,但不确定哪个才是正确的。第三个(\ieC
我一直在使用的)似乎产生的间距略有不同。我无法弄清楚如何调整
\etc
数学模式的宏来正确处理像 中那样的后续句号的情况\etc.
。此外,似乎添加 会\ifmmode
搞砸\etc
宏,以至于如果有尾随句号,它即使在文本模式下也无法正常工作。
如果有一个可以\xspace
在数学模式下运行的宏版本那就太好了。
参考:
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xspace}
\newcommand*{\ieA}{%
\ifmmode%
\text{i.e.}\ %
\else%
i.e.\@\xspace%
\fi%
}%
\newcommand*{\ieB}{%
\ifmmode%
\text{i.e.~}%
\else%
i.e.\@\xspace%
\fi%
}%
\newcommand*{\ieC}{%
\ifmmode%
\text{i.e. }%
\else%
i.e.\@\xspace%
\fi%
}%
\makeatletter
\newcommand*{\etc}{%
\ifmmode%
\@ifnextchar{.}{\text{etc}}{\text{etc.}}%
\else%
\@ifnextchar{.}%
{etc}%
{etc.\@\xspace}%
\fi%
}%
\makeatother
\begin{document}\noindent
$\ieA x < 2$ \quad \verb|\text{i.e.}\ |\par\noindent
$\ieB x < 2$ \quad \verb|\text{i.e.~}|\par \noindent
$\ieC x < 2$ \quad \verb|\text{i.e. }|\par\noindent
\medskip\noindent
$a \ne 0, b \ne 0, \etc$\par\noindent
$a \ne 0, b \ne 0, \etc.$\par\noindent
\medskip\noindent
$a \ne 0, b \ne 0, \text{\etc}$ \quad \verb|\text{\etc}|\par\noindent
$a \ne 0, b \ne 0, \text{\etc.}$\quad \verb|\text{\etc.}|\par\noindent
\bigskip
\noindent
Outside of math mode \verb|\etc| no longer works at the end of sentence
\noindent
You should eat more fruit, \ieA apples, bananas, \etc. Next sentence.
\noindent
You should eat more fruit, \ieA, apples, bananas, \etc but also tomatoes.
\end{document}
上述 MWE 是为了测试目的,所以我同意在这些情况下,那里的缩写没有必要在数学环境中。但对于我的实际用例来说,在显示模式下,将该文本作为公式的一部分而不是放在下一行更清楚。例如:
答案1
您的第三个版本\ieC
会产生更大的间距,因为您处于.
文本模式,即句号结束一个句子。通常人们可能会写i.e.\ $x<2$
,这与您的第一个版本相对应\ieA
。但这取决于您的选择。也许在显示数学中您会更喜欢更大的间距。
至于你的第二个问题,你的\etc
不起作用,因为它缺少\expandafter
。你用测试下一个字符\@ifnextchar
,但看看你的代码:在数学模式下,你测试\else
,否则你测试\fi
!我知道,这是 TeX 编程会让你发疯的地方。你必须做的是:使用\expandafter
摆脱\else
和,\fi
以便\@ifnextchar
可以真正看到下一个特点。
附注:您应该在a \ne 0,
和之间留出一些空格b \ne 0
。此外,您的代码确实包含很多%
可以省略的 。这是我对 的解决方案\etc
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xspace}
\makeatletter
\newcommand*{\textetc}{%
\@ifnextchar{.}
{etc}
{etc.\@\xspace}%
}
\newcommand*{\mathetc}{%
\@ifnextchar{.}
{\text{etc}}
{\text{etc.}}%
}
\makeatother
\newcommand*{\etc}{%
\ifmmode
\expandafter\mathetc
\else
\expandafter\textetc
\fi
}
\begin{document}\noindent
$a \ne 0,\ b \ne 0,\ \etc$\par\noindent
$a \ne 0,\ b \ne 0,\ \etc.$\par\noindent
\medskip\noindent
$a \ne 0,\ b \ne 0,\ \text{\etc}$ \quad \verb|\text{\etc}|\par\noindent
$a \ne 0,\ b \ne 0,\ \text{\etc.}$ \quad \verb|\text{\etc.}|\par\noindent
\bigskip
\noindent
Outside of math mode \verb|\etc| works now at the end of sentences!
\noindent
You should eat more fruit, i.e.\ apples, bananas, \etc. Next sentence.
\noindent
You should eat more fruit, i.e., apples, bananas, \etc but also tomatoes.
\end{document}
答案2
你的前提是错误的。TeX 输入如下
$a\ne0, b\ne0, \etc$
是完全错误的。这些都是二公式后跟文本:
$a\ne0$, $b\ne0$, \etc
(有人应该问“etc.”这个缩写是否真的很好,但这是另一个问题;我从来不用它)。
为了回答手头的问题,我想说
\makeatletter
\newcommand{\etc}{%
\mbox{etc}\@ifnextchar.{}{.\@\xspace}%
}
\makeatother
就是你要找的。\xspace
无论如何,在数学模式下,空间因子设置和可能插入的空间都会被忽略。我认为这\etc
永远不会出现在下标或上标中,那会太多。:)
同样,i.e.,~$x<2$
是正确的输入。或者,没有逗号,i.e.~$x<2$
。在公式中放入“ie”是错误的:它不是数学。这样你就得到了不空格问题。“ie”的定义可以是
\newcommand{\ie}{i.e.,\xspace}
或者
\newcommand{\ie}{i.e.\@\xspace}
取决于您是否需要逗号。