Posso fazer com que $$...$$ se comporte como \[...\]?

Posso fazer com que $$...$$ se comporte como \[...\]?

É possível modificar o LaTeX para que o bom e velho $$...$$se comporte como \[...\](e com isso quero dizer que deveria ser sinônimo dele).

Se sim:Caro desenvolvedor LaTeX3, por favor integre isso ao LaTeX3! (Não que eu realmente acredite que você realmente fará isso.)

MWE (mesmo que eu realmente não veja seu uso neste 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}

Responder1

Aqui está uma solução baseada em LuaLaTeX para o seu desafio.

A função Lua replace_ddollarna verdade não redefine o $$primitivo. Em vez disso, ele verifica o texto de entrada em um estágio muito inicial de processamento (antesOs "olhos" do TeX começam a fazer qualquer coisa) e substitui todas as instâncias de $$por \[ou \]. O código Lua pode lidar com códigos como

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

ou seja,pares combinadosde $$diretivas em uma única linha, bem como o formato usual de entrada para equações, ou seja,

$$
E = mc^2
$$ 

Observação: Precisamente porque $$énãosendo redefinidos nesta abordagem, as coisas podem (e irão) dar errado se o documento contiver instâncias que $$sãonãousado para iniciar ou encerrar o modo display-math. Alguns exemplos de tais casos:

  • Instâncias incomparáveis $$​​em um comentário (incluindo commentambientes semelhantes a -)
  • Instâncias de $$em um ambiente semelhante ao literal
  • Instâncias de $$uma string de URL encapsulada em uma \url{...}diretiva

(Tenho certeza de que ainda há mais possibilidades de algo dar errado.) Caso você tenha tais instâncias em seu documento, o código abaixo fornece a macro \ReplaceDoubleDollarOff, que desativa a operação da função Lua replace_ddollar. Há também uma macro complementar, chamada \ReplaceDoubleDollarOn, que ativa novamente a função Lua.

O risco representado por instâncias únicas de $$em uma linha de entrada que não se destinam a iniciar ou terminar o modo displaymath pode ser bastante reduzido se puder ser assumido que as únicas instâncias que $$devem iniciar ou terminar o modo displaymath ocorrem no mesmo momento. início de uma linha: Se esta suposição for válida, simplesmente reduza a string de pesquisa na segunda string.gsubfunção, "%$%$", com "^%$%$". O ^caractere indica que uma correspondência só poderá ocorrer se $$ocorrer bem no início de uma linha. [Caso você esteja curioso para saber por que o código Lua contém %$%$em vez de apenas $$: Em Lua, o $caractere é "especial" e deve ser escapado (prefixando um %símbolo) para denotar um $símbolo real.]

insira a descrição da imagem aqui

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

Responder2

Esta será sem dúvida uma resposta controversa, mas aqui vai nada! 1

O que você está perguntando é falho em sua premissa: se você quisesse modificar $$...$$para se comportar como \[...\]se não fosse LaTeX, mas TeX, você teria que modificar. O LaTeX não altera $$em nada o comportamento da definição do TeX.

Tudo o que \[...\]existe é um wrapper $$...$$para fazer algumas verificações de modo, fornecer alguns relatórios de erros aprimorados e alterar algum espaçamento se a exibição ocorrer no início de um parágrafo. Você pode ver a definição completa nas fontes e/ou na resposta aceita paraQuais são as diferenças entre $$, \[, alinhar, equação e displaymath?.

Portanto, o LaTeX pegou o básico do Plain TeX e o estendeu para cobrir os casos de uso de uma suposta maioria de usuários. Não é diferente de qualquer outra macro fornecida pelo LaTeX: é um aumento dos blocos de construção fornecidos pelo TeX.

Na minha opinião, se você quiser o comportamento de \[...\], basta usar \[...\]. Redefinir $$, embora provavelmente seja tecnicamente possível, não é trivial porque o próprio comando que define o comportamento desejado o utiliza internamente. Além disso, não se sabe quantos documentos (às vezes mal projetados, mas mesmo assim) dependem da funcionalidade antiga.


1 Segure minha cerveja!

Responder3

Esta é talvez a implementação mais fácil. Eu ainda quero me estressarnãopara usar código como este. Ou dá errado desde o início, ou pior: em um ponto você deseja alterar algo no documento, você recebe um erro que informa que está faltando um \item(ou algo não relacionado a qualquer modo matemático), e você tem para recodificar todo o seu documento porque tudo quebra.

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

Responder4

Esta solução não é perfeita: não verifica erros e provavelmente apresenta outros problemas. Faz $ e personagem ativo, o que quebra alguns pacotes que não esperam isso. Mas se você colocar o seguinte próximo ao final do preâmbulo, pode funcionar principalmente. Eu tentei em dois dos meus documentos e parecia ok.

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

Ou algo assim.

informação relacionada