我发现自己花了力气在输入的每个内联数学之前放置波浪符号,例如,
On 1899, G. Pick proved that
the area of a simple polygon~$P$ whose vertices are
located on the integer grid is~$i + b/2 -1$,
where~$i$ is the number of grid points in the interior of%
~$P$ and~$b$ is the number of grid points on the
the boundary of~$P$.
有人能想出一种方法来重新定义开头的 $ 字符,以便它能够自动执行此操作吗?我认为很多人会发现这很有用。理想情况下,我会这样写
On 1899, G. Pick proved that
the area of a simple polygon $P$ whose vertices are
located on the integer grid is $i + b/2 -1$,
where $i$ is the number of grid points in the interior of
$P$ and $b$ is the number of grid points on the
the boundary of $P$.
我认为,但不确定,通过以下方法可以实现这一点:
- 使用 $ 以外的字符进行内联数学运算(或内部引用
\(
和\)
) - 将 $ 定义为活动字符
\unskip
,它将先前的空格替换为不可中断的空格。 - 取消跳过后,让 $ 重新定义自己来执行关闭部分。
- 结尾的 $ 将调用
\)
然后重新定义 $,如 2 所示。
这种方法的一个明显缺陷是,用 $$ 包裹的数学运算会出错。我有一种不愉快的感觉,可能还会有更多。
答案1
以下是使用活动字符方法的示例。我并不反对在您自己的文档中使用这种想法,但请注意,这可能不是最可靠的方法(就像 Martin 所评论的那样,这可能会影响其他软件包的内部运作——这样做\AtBeginDocument
可能是一个好主意)。
\documentclass{article}
\makeatletter
\let\mathshift=$
\catcode`\$=\active
\protected\def$#1${%
\ifdim\lastskip>\z@ \unskip\textvisiblespace \fi
\mathshift #1\mathshift
}
\DeclareRobustCommand\({% from fixltx2e
\ifdim\lastskip>\z@ \unskip\textvisiblespace \fi
\ifmmode \@badmath \else \mathshift\fi
}
\makeatother
\begin{document}
\tableofcontents
\section{Introduction} Hello $a+b$
\section{Not sure $x=y$. $x=z$ though!}
And \( f(x) = x^2 \) too.
We'd better ensure no space gets added if there's nothing before the maths:
\begin{tabular}{|c|c|}
\hline
$a$ & $b$ \\
$c$ & $d$ \\
\hline
\end{tabular}
\end{document}
为了使示例真正展示这个想法,我使用了可见空间而不是硬空间。删除\textvisiblespace
上面的~
内容以供实际使用:)
另外,我上面假设您没有使用$$...$$
显示数学,因为严格来说它不是有效的 LaTeX 语法。
答案2
不破坏其他人的软件包的一种方法是依靠软件包编写者倾向于保守并遵守 ASCII 的事实。因此,我将重新定义 Will 所做的同一组宏,但将它们通过数学字符参数化,该字符可以默认为或不默认为$
。
我不知道如何做到这一点,但想象一下你可以写
\usepackage[begin=〈, end=〉]{nbsm}
然后继续,用 和 包裹内联数学〈
。〉
或者如果你是大胆的类型,
\usepackage[begin=$, end=$]{nbsm}