$$...$$
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{...}
(問題が発生する可能性はまだあると思います。) ドキュメント内にそのようなインスタンスがある場合に備えて、以下のコードには、\ReplaceDoubleDollarOff
Lua 関数 の動作をオフにするマクロ が用意されています。また、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 が提供するビルディング ブロックを拡張したものなのです。
私の意見では、 の動作が必要な場合は\[...\]
、 を使用するだけです\[...\]
。 を再定義することは$$
、おそらく技術的には可能ですが、目的の動作を定義するコマンド自体が内部的に を使用しているため、簡単ではありません。さらに、古い機能に依存しているドキュメント (設計が悪い場合もありますが、それでも) がどれだけあるかはわかりません。
答え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
あるいはそんな感じ。