Kann ich $$...$$ dazu bringen, sich wie \[...\] zu verhalten?

Kann ich $$...$$ dazu bringen, sich wie \[...\] zu verhalten?

Ist es möglich, LaTeX so zu ändern, dass es $$...$$sich wie das gute alte verhält \[...\](und damit meine ich, dass es synonym dazu sein sollte).

Falls ja:Lieber LaTeX3-Entwickler, bitte integrieren Sie dies in LaTeX3! (Nicht, dass ich wirklich glaube, dass Sie das tatsächlich tun werden.)

MWE (auch wenn ich in diesem Fall keinen wirklichen Nutzen darin sehe):

\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}

Antwort1

Hier ist eine LuaLaTeX-basierte Lösung für Ihr Problem.

Die Lua-Funktion replace_ddollardefiniert das Primitiv nicht wirklich neu $$. Stattdessen scannt sie den Eingabetext in einem sehr frühen Stadium der Verarbeitung (VorTeXs "Augen" beginnen, irgendetwas zu tun) und ersetzt alle Vorkommen von $$entweder durch \[oder \]. Der Lua-Code kann Code wie

 $$a^2+b^2=c^2$$ 

dh,passende Paarevon $$Anweisungen in einer einzigen Zeile, sowie das übliche Eingabeformat für Gleichungen, d. h.

$$
E = mc^2
$$ 

Anmerkung: Gerade $$weilnichtBei diesem Ansatz können (und werden) Dinge schiefgehen, wenn das Dokument Instanzen von enthält, $$dienichtwird verwendet, um den Anzeigemathematikmodus zu starten oder zu beenden. Einige Beispiele für solche Fälle:

  • Nicht übereinstimmende Instanzen von $$in einem Kommentar (einschließlich comment-ähnlicher Umgebungen)
  • Instanzen von $$in einer verbatimähnlichen Umgebung
  • Instanzen von $$in einer URL-Zeichenfolge, die in einer \url{...}Direktive eingeschlossen ist

(Ich bin sicher, dass es noch mehr Möglichkeiten gibt, dass etwas schief geht.) Nur für den Fall, dass Ihr Dokument solche Fälle enthält, stellt der folgende Code das Makro bereit \ReplaceDoubleDollarOff, das die Ausführung der Lua-Funktion abschaltet replace_ddollar. Es gibt auch ein Begleitmakro namens \ReplaceDoubleDollarOn, das die Lua-Funktion wieder einschaltet.

Das Risiko, das von einzelnen Instanzen von $$in einer Eingabezeile ausgeht, die den Displaymath-Modus nicht einleiten oder beenden sollen, kann erheblich reduziert werden, wenn davon ausgegangen werden kann, dass die einzigen Instanzen von , $$die den Displaymath-Modus einleiten oder beenden sollen, ganz am Anfang einer Zeile stehen: Wenn diese Annahme gültig ist, reduzieren Sie einfach die Suchzeichenfolge in der zweiten string.gsubFunktion, "%$%$", mit "^%$%$". Das ^Zeichen gibt an, dass eine Übereinstimmung nur dann auftreten kann, wenn $$es ganz am Anfang einer Zeile steht. [Falls Sie sich fragen, warum der Lua-Code %$%$statt nur enthält $$: In Lua $ist das Zeichen „speziell“ und muss maskiert werden (durch Präfix eines %Symbols), um ein tatsächliches $Symbol zu kennzeichnen.]

Bildbeschreibung hier eingeben

% !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}

Antwort2

Dies wird zweifellos eine kontroverse Antwort sein, aber los geht‘s! 1

Ihre Frage ist in ihrer Prämisse fehlerhaft: Wenn Sie Änderungen vornehmen möchten, $$...$$damit es sich so verhält, als \[...\]wäre es nicht LaTeX, sondern TeX, müssten Sie Änderungen vornehmen. LaTeX ändert das Verhalten $$der TeX-Definition überhaupt nicht.

Es handelt sich lediglich \[...\]um einen Wrapper, der $$...$$einige Modusprüfungen durchführt, eine verbesserte Fehlerberichterstattung bereitstellt und einige Abstände ändert, wenn die Anzeige am Anfang eines Absatzes erfolgt. Die vollständige Definition finden Sie in den Quellen und/oder in der akzeptierten Antwort aufWas sind die Unterschiede zwischen $$, \[, align, equation und displaymath?.

LaTeX hat also die Plain TeX-Grundlagen übernommen und erweitert, um die Anwendungsfälle einer mutmaßlichen Mehrheit der Benutzer abzudecken. Es unterscheidet sich nicht von jedem anderen von LaTeX bereitgestellten Makro: Es ist eine Erweiterung der von TeX bereitgestellten Bausteine.

Wenn Sie das Verhalten von wollen, verwenden Sie meiner Meinung nach \[...\]einfach \[...\]. Eine Neudefinition von $$ist zwar technisch wahrscheinlich möglich, aber nicht trivial, da der Befehl selbst, der das gewünschte Verhalten definiert, es intern verwendet. Darüber hinaus ist nicht abzusehen, wie viele (manchmal schlecht gestaltete, aber dennoch) Dokumente auf der alten Funktionalität basieren.


1 Halte mein Bier!

Antwort3

Dies ist vielleicht die einfachste Umsetzung. Ich möchte noch betonennichtCode wie diesen zu verwenden. Entweder geht es von Anfang an schief oder schlimmer: Wenn Sie an einem Punkt etwas im Dokument ändern möchten, erhalten Sie eine Fehlermeldung, die Sie darüber informiert, dass ein \item(oder etwas anderes, das nichts mit dem Mathematikmodus zu tun hat) fehlt, und Sie müssen Ihr gesamtes Dokument neu codieren, weil alles zusammenbricht.

\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}

Antwort4

Diese Lösung ist nicht perfekt: Sie führt keine Fehlerprüfung durch und hat wahrscheinlich andere Probleme. Sie erzeugt $ und ein aktives Zeichen, was einige Pakete, die das nicht erwarten, kaputt macht. Aber wenn Sie das Folgende am Ende Ihrer Präambel einfügen, funktioniert es größtenteils. Ich habe es bei zwei meiner Dokumente ausprobiert und es schien in Ordnung zu sein.

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

Oder etwas ähnliches.

verwandte Informationen