我想定义一个短语一次包含数学和文本,并能够使用两个都数学和文本模式。例如:
\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{ and } \ensuremath{x \neq -1}}
这在数学模式下运行良好,但在文本模式下会留下太多空间。当然:
\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{and} \ensuremath{x \neq -1}}
在文本模式下工作正常,但在数学模式下则不行。
这让我想到:
\newcommand{\Space}{\ifmmode{ }\else{}\fi}%
\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{\Space and\Space} \ensuremath{x \neq -1}}
这当然是一个绝妙的解决方案,除了它只能在文本模式下产生正确的结果!!我尝试用{ }
各种数学间距(\;
,和\hspace{1ex}
)替换它们,但它们在数学模式下不起作用。
在两种情况下都能产生正确间距的一种情况是使用\mbox
如下形式:
\newcommand{\Constraint}{\mbox{\ensuremath{x \neq 0} and \ensuremath{x \neq -1}}}
但是文本不能跨行边界分割,所以不够好。
以下是我注释掉的各种失败尝试。代码如下:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xspace}
\usepackage{showframe}
%%%% Math Mode: Works fine
%%%% Text Mode: Too much space before and after "and"
%\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{ and } \ensuremath{x \neq -1}}
%%%% Math Mode: No space before and after "and"
%%%% Text Mode: Works fine
%\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{and} \ensuremath{x \neq -1}}
%%%% Math Mode: Works fine
%%%% Text Mode: Too much space before and after "and"
%\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{~and~} \ensuremath{x \neq -1}}
%%%% Math Mode: missing space after "and"
%%%% Text Mode: Too much space before and after "and"
%\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{~and\xspace} \ensuremath{x \neq -1}}
%%%% Math Mode: missing spaces before and after
%%%% Text Mode: Works fine.
\newcommand{\Space}{\ifmmode{ }\else{}\fi}%
\newcommand{\Constraint}{\ensuremath{x \neq 0} \text{\Space and\Space} \ensuremath{x \neq -1}}
\begin{document}
\begin{align*}
\frac{2x}{x+1} &= \frac {2x-1}{x}\\
\implies 2x (x) &= (x+1) (2x-1) \qquad\Constraint
\end{align*}
%
In a short sentence note the constraint: \Constraint.
In a long sentence note the above the constraint must be satisfied: $\Constraint$.
\end{document}
答案1
编辑:下一步尝试:将空间转移到室外\text
\newcommand\Space{\penalty\z@\hspace{1ex}}
\newcommand{\Constraint}{\ensuremath{x \neq 0\Space\text{and}\Space x \neq -1}}
我本来期望数学模式已经有一个可破坏的空间,所以也许我仍然弄错了什么......
答案2
唯一能做的就是说
\newcommand{\Constraint}{%
\relax\ifmmode
x\neq 0 \text{ and } x\neq 1
\else
$x\neq 0$ and $x\neq 1$
\fi}
如果已经加载babel
,那么\textormath
可以用来代替条件,但概念是相同的。
为什么不\ensuremath{x\neq 0 \text{ and } x\neq1}
?
首先因为它使用了\ensuremath
. :) 说真的,因为唯一的断点是在关系符号之后\neq
,也就是断点所在的地方较少的更可取。事实上,问题是,这\text
会创建一个框。
在合适的地方添加连接线\nobreak
。在定义这些缩写时要小心(几个月后,当你再次阅读该文件时,这将是神秘的)。
如何避免重复文字?我的解决办法是拼写文本,而不是使用神秘的缩写。或者,如果你坚持,
\newcommand{\ensuretext}[1]{\ifmmode\text{#1}\else#1\fi}
\newcommand{\Constraint}{%
\ensuremath{x\neq 0}\ensuretext{ and }\ensuremath{x \neq 1}}
这比指定两次文本更糟糕。
答案3
替换ensuremath
为\( \)
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xspace}
\newcommand{\Constraint}{\mbox{\(x \neq 0\) and \(x \neq -1\)}} %<---- replace \ensure math{} by \( \).
%------------------------------------
\begin{document}
\begin{align*}
\frac{2x}{x+1} &= \frac {2x-1}{x}\\
\implies 2x (x) &= (x+1) (2x-1) \qquad\Constraint
\end{align*}
%
Note in the above the constraint: \Constraint.
\end{document}