我可以让 $$...$$ 表现得像 \[...\] 吗?

我可以让 $$...$$ 表现得像 \[...\] 吗?

是否可以修改 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 提供的构建块的增强。

我认为,如果您想要 的行为\[...\],只需使用\[...\]。重新定义$$,虽然在技术上可能可行,但并非易事,因为定义所需行为的命令本身在内部使用它。此外,不知道有多少(有时设计得很糟糕,但无论如何)文档依赖于旧功能。


1 拿着我的啤酒瓶子(来源于某笑话!

答案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

或类似的东西。

相关内容