是否可以修改 LaTeX,以便使其$$...$$
表现得像旧版本一样\[...\]
(我的意思是它应该与它同义)。
如果是:亲爱的 LaTeX3 开发人员,请将其集成到 LaTeX3 中!(我并不真的相信你会这样做。)
MWE(即使我并没有真正看到它在这种情况下的用途):
\documentclass{article}
\begin{document}
I've forgotten we're not in the plain \TeX\ world anymore:
$$
x = 3\alpha^2 + \beta
= \int f\, d\mu.
$$
\end{document}
答案1
这是针对您的挑战的基于 LuaLaTeX 的解决方案。
Lua 函数replace_ddollar
实际上并没有重新定义$$
原语。相反,它在处理的早期阶段扫描输入文本(前TeX 的“眼睛”开始做任何事情),并将 的所有实例替换$$
为\[
或\]
。Lua 代码可以处理如下代码
$$a^2+b^2=c^2$$
IE,匹配对$$
单行上的指令,以及方程的通常输入格式,即,
$$
E = mc^2
$$
评论: 正是$$
因为不是以这种方式重新定义,如果文档包含$$
以下实例,事情可能会(并且会)出错:不是用于启动或终止显示数学模式。以下是此类情况的一些示例:
$$
注释中不匹配的实例(包括comment
类似环境)$$
逐字环境中的实例- 指令
$$
中包含的 URL 字符串中的实例\url{...}
(我确信还有更多出错的可能性。)万一您的文档中确实有此类情况,下面的代码提供了宏\ReplaceDoubleDollarOff
,可关闭 Lua 函数的操作replace_ddollar
。还有一个配套宏,称为\ReplaceDoubleDollarOn
,可重新打开 Lua 函数。
$$
如果可以假设用于启动或终止 displaymath 模式的 的唯一实例出现在行首,则可以大大降低输入行中出现不用于启动或终止 displaymath 模式的单个 实例所带来的风险:如果此假设成立,则只需将第二个函数$$
中的搜索字符串 简化为。该字符表示仅当 出现在行首时才会匹配。[如果您好奇为什么 Lua 代码包含而不仅仅是:在 Lua 中,该字符是“特殊”的,必须进行转义(通过在符号前加上前缀)才能表示实际符号。]string.gsub
"%$%$"
"^%$%$"
^
$$
%$%$
$$
$
%
$
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
in_display_math = false
function replace_ddollar ( line )
line = string.gsub ( line , "%$%$(.-)%$%$" , "\\[ %1 \\]" )
line = string.gsub ( line , "%$%$" , function (x)
if not in_display_math then
in_display_math = true
return "\\["
else
in_display_math = false
return "\\]"
end
end )
return line
end
\end{luacode}
\newcommand\ReplaceDoubleDollarOn{%
\directlua{ luatexbase.add_to_callback(
"process_input_buffer", replace_ddollar, "replace_ddollar" )}}
\newcommand\ReplaceDoubleDollarOff{%
\directlua{ luatexbase.remove_from_callback(
"process_input_buffer", "replace_ddollar" )}}
\ReplaceDoubleDollarOn % Replacement function turned on
\usepackage{url} % just for this example
\begin{document}
$$
E = mc^2
$$
$$a^2+b^2=c^2$$ $$d^2+e^2=f^2$$ % Aside: I do not endorse this coding style!
$$
x = 3\alpha^2 + \beta = \int f\, d\mu.
$$
% Turn off replacement of double-dollars
\ReplaceDoubleDollarOff
\url{A_URL_string_with_a_$$_and_$$$$_and_another_$$}
% Turn replacement of double-dollars back on
\ReplaceDoubleDollarOn
$$ e^{i\pi}-1=0 $$
$$
1+1=2
$$
\end{document}
答案2
这无疑会是一个有争议的答案,但我不打算回答!1
您所问的问题在前提上是有缺陷的:如果您想修改它$$...$$
,使它表现得像\[...\]
不是 LaTeX,而是 TeX,那么您必须对其进行修改。$$
从 TeX 定义来看,LaTeX 根本不会改变其行为。
所有这些\[...\]
都是一个包装器,$$...$$
用于进行一些模式检查,提供一些增强的错误报告,并在显示发生在段落开头时更改一些间距。您可以在来源和/或接受的答案中看到完整的定义$$、\[、align、equation 和 displaymath 之间有什么区别?。
因此,LaTeX 采用了 Plain TeX 基础知识,并对其进行了扩展,以涵盖假定大多数用户的用例。它与 LaTeX 提供的任何其他宏没有什么不同:它是 TeX 提供的构建块的增强。
我认为,如果您想要 的行为\[...\]
,只需使用\[...\]
。重新定义$$
,虽然在技术上可能可行,但并非易事,因为定义所需行为的命令本身在内部使用它。此外,不知道有多少(有时设计得很糟糕,但无论如何)文档依赖于旧功能。
答案3
这也许是最简单的实现。我仍然想强调不是使用这样的代码。要么从一开始就出错,要么更糟:在某一时刻,您希望更改文档中的某些内容,您会收到一条错误消息,告知您缺少\item
(或与任何数学模式无关的其他内容),并且您必须重新编码整个文档,因为所有内容都崩溃了。
\documentclass{article}
%\usepackage[fleqn]{amsmath} % also works for instance
\let\dollar=$ \catcode`$=\active
\makeatletter
\protected\def${\@ifnextchar${\@doubledollareqn}{\@singledollareqn}}
\def\@singledollareqn#1${\(#1\)}
\def\@doubledollareqn$#1$${\[#1\]}
\makeatother
\begin{document}
Inline math $x^2+y^2=z^2$.
$$
f(v)=4\pi\left(\frac m{2\pi kT}\right)^{\frac32}v^2e^{-\frac{mv^2}{2kT}}.
$$
\end{document}
答案4
此解决方案并不完美:它不进行错误检查,并且可能存在其他问题。它会产生 $ 和活动字符,这会破坏一些不期望这种情况的软件包。但如果您将以下内容放在序言末尾附近,它可能大部分都会起作用。我在我的两个文档上尝试过它,似乎没问题。
\catcode\`$\active
\makeatletter
\protected\def\ExpectBeginMath{\@ifnextchar${\let$\ExpectEndDisplayMath\[\@gobble}{\let$\ExpectEndInlineMath\(}}
\def\ExpectEndDisplayMath{\]\let$\ExpectBeginMath\@gobble}
\def\ExpectEndInlineMath{\)\let$\ExpectBeginMath}
\makeatother
\let$\ExpectBeginMath
或类似的东西。