我能讓 $$...$$ 表現得像 \[...\] 嗎?

我能讓 $$...$$ 表現得像 \[...\] 嗎?

是否可以修改 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 功能。

$$如果可以假設應該啟動或終止顯示數學模式的唯一實例發生在輸入行上的單一實例所帶來的風險,那麼$$這些實例並不意味著啟動或終止顯示數學模式。需使用減少第二個函數中的搜尋string.gsub字串"%$%$""^%$%$"該字元表示僅當出現在行的開頭^時才會發生匹配。 $$[如果你好奇為什麼 Lua 代碼包含%$%$而不僅僅是$$: 在 Lua 中,該$字符是“特殊”的,必須進行轉義(通過添加符號前綴%)才能表示實際的$符號。

在此輸入影像描述

% !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,你就必須修改。 LaTeX$$根本不會改變 TeX 定義中的行為。

所有這一切\[...\]都是一個包裝$$...$$用於執行一些模式檢查,提供一些增強的錯誤報告,並在顯示發生在段落開頭時更改一些間距。您可以在來源和/或已接受的答案中查看完整的定義$$、\[、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

這個解決方案並不完美:它不進行錯誤檢查,並且可能有其他問題。它生成 $ 和 active 字符,這會破壞一些不期望的包。但是,如果您將以下內容放在序言末尾附近,那麼它可能基本上有效。我在我的兩份文件上嘗試過,看起來沒問題。

\catcode\`$\active
\makeatletter
\protected\def\ExpectBeginMath{\@ifnextchar${\let$\ExpectEndDisplayMath\[\@gobble}{\let$\ExpectEndInlineMath\(}}
\def\ExpectEndDisplayMath{\]\let$\ExpectBeginMath\@gobble}
\def\ExpectEndInlineMath{\)\let$\ExpectBeginMath}
\makeatother
\let$\ExpectBeginMath

或類似的東西。

相關內容