¿Puedo hacer que $$...$$ se comporte como \[...\]?

¿Puedo hacer que $$...$$ se comporte como \[...\]?

¿Es posible modificar LaTeX para que el viejo $$...$$se comporte como \[...\](y con esto quiero decir que también debería serlo).

En caso afirmativo:Estimado desarrollador de LaTeX3, ¡integre esto en LaTeX3! (No es que realmente crea que vayas a hacer esto).

MWE (aunque realmente no veo su utilidad en este caso):

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

Respuesta1

Aquí tienes una solución basada en LuaLaTeX para tu desafío.

La función Lua replace_ddollaren realidad no redefine la $$primitiva. En cambio, escanea el texto de entrada en una etapa muy temprana del procesamiento (antesLos "ojos" de TeX comienzan a hacer cualquier cosa) y reemplaza todas las instancias de $$con \[o \]. El código Lua puede manejar código como

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

es decir,pares emparejadosde $$directivas en una sola línea, así como el formato de entrada habitual para ecuaciones, es decir,

$$
E = mc^2
$$ 

Observación: Precisamente porque $$esnoAl redefinirse en este enfoque, las cosas pueden (y saldrán) mal si el documento contiene instancias de $$eso.noSe utiliza para iniciar o finalizar el modo de visualización matemática. Algunos ejemplos de tales casos:

  • Instancias no coincidentes de $$en un comentario (incluidos commententornos similares)
  • Ejemplos de $$en un entorno similar al literal
  • Instancias de $$en una cadena URL encerrada en una \url{...}directiva

(Estoy seguro de que todavía hay más posibilidades de que las cosas salgan mal). En caso de que tenga tales casos en su documento, el siguiente código proporciona la macro \ReplaceDoubleDollarOff, que desactiva la operación de la función Lua replace_ddollar. También hay una macro complementaria, llamada \ReplaceDoubleDollarOn, que vuelve a activar la función Lua.

El riesgo planteado por instancias únicas de $$en una línea de entrada que no están destinadas a iniciar o terminar el modo displaymath se puede reducir en gran medida si se puede asumir que las únicas instancias de $$que se supone que inician o terminan el modo displaymath ocurren en el mismo Inicio de una línea: si esta suposición es válida, simplemente reduzca la cadena de búsqueda en la segunda string.gsubfunción, "%$%$"con "^%$%$". El ^carácter indica que una coincidencia sólo puede ocurrir si $$ocurre al principio de una línea. [En caso de que tenga curiosidad por saber por qué el código Lua contiene %$%$en lugar de solo $$: En Lua, el $carácter es "especial" y debe tener carácter de escape (anteponiendo un %símbolo) para indicar un $símbolo real.]

ingrese la descripción de la imagen aquí

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

Respuesta2

Esta será sin duda una respuesta controvertida, ¡pero aquí no hay nada! 1

Lo que estás preguntando tiene una premisa errónea: si quisieras modificar $$...$$para que se comportara como \[...\]si no fuera LaTeX, sino TeX, tendrías que modificarlo. LaTeX no cambia $$en absoluto el comportamiento de la definición de TeX.

Todo lo que \[...\]es es un contenedor $$...$$para realizar algunas comprobaciones de modo, proporcionar informes de errores mejorados y cambiar algunos espacios si la visualización ocurre al principio de un párrafo. Puede ver la definición completa en las fuentes y/o en la respuesta aceptada a¿Cuáles son las diferencias entre $$, \[, align, ecuación y displaymath?.

Entonces LaTeX tomó los conceptos básicos de Plain TeX y los amplió para cubrir los casos de uso de una supuesta mayoría de usuarios. No es diferente de cualquier otra macro proporcionada por LaTeX: es un aumento de los componentes básicos proporcionados por TeX.

En mi opinión, si desea el comportamiento de \[...\], simplemente use \[...\]. Redefinir $$, aunque probablemente sea técnicamente posible, no es trivial porque el mismo comando que define el comportamiento deseado lo usa internamente. Además, no se sabe cuántos documentos (a veces mal diseñados, pero no obstante) dependen de la funcionalidad anterior.


1 ¡Sostenga mi cerveza!

Respuesta3

Esta es quizás la implementación más sencilla. Todavía deseo estresarnopara usar código como este. O sale mal desde el principio, o peor: en un momento desea cambiar algo en el documento, recibe un error que le indica que le falta un modo matemático \item(o algo más que no esté relacionado con ningún modo matemático), y tiene recodificar todo el documento porque todo se estropea.

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

Respuesta4

Esta solución no es perfecta: no comprueba errores y probablemente tenga otros problemas. Genera $ y un carácter activo, lo que rompe algunos paquetes que no esperan eso. Pero si coloca lo siguiente cerca del final de su preámbulo, es posible que funcione. Lo probé en dos de mis documentos y parecía estar bien.

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

O algo así.

información relacionada