$$...$$ を \[...\] のように動作させることはできますか?

$$...$$ を \[...\] のように動作させることはできますか?

$$...$$LaTeX を変更して、古き良きもののように動作するようにすることは可能ですか\[...\](つまり、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$$ 

つまり、マッチしたペア1行に複数の$$指示を記述できるほか、通常の方程式の入力形式、つまり

$$
E = mc^2
$$ 

述べる: まさにそれ$$ない$$このアプローチでは再定義されるため、文書に次のようなインスタンスが含まれていると、問題が発生する可能性があります。ない表示数式モードを開始または終了するために使用されます。このようなインスタンスの例をいくつか示します。

  • $$コメント内の一致しない のインスタンス( comment-like 環境を含む)
  • $$逐語的環境における例
  • ディレクティブ$$で囲まれたURL文字列内のインスタンス\url{...}

(問題が発生する可能性はまだあると思います。) ドキュメント内にそのようなインスタンスがある場合に備えて、以下のコードには、\ReplaceDoubleDollarOffLua 関数 の動作をオフにするマクロ が用意されています。また、Lua 関数 をオンに戻す とreplace_ddollar呼ばれるコンパニオン マクロもあります。\ReplaceDoubleDollarOn

$$入力行に displaymath モードを開始または終了することを意図していない の単一インスタンスが存在することによるリスクは、$$displaymath モードを開始または終了することになっている のインスタンスのみが行の先頭に出現すると想定できる場合、大幅に軽減できます。この想定が有効な場合は、2 番目の関数 の検索文字列 を に短縮するだけです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

この解決策は完璧ではありません。エラー チェックを行わず、おそらく他の問題もあります。$ とアクティブ文字を作成するため、これを想定していない一部のパッケージが動作しなくなります。ただし、次のコードをプリアンブルの末尾近くに記述すれば、ほとんどの場合は機能する可能性があります。2 つのドキュメントで試してみましたが、問題ありませんでした。

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

あるいはそんな感じ。

関連情報