$$...$$가 \[...\]처럼 작동하도록 할 수 있나요?

$$...$$가 \[...\]처럼 작동하도록 할 수 있나요?

$$...$$LaTeX를 수정하여 good old가 다음과 같이 동작하도록 하는 것이 가능합니까? \[...\](이것은 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$$ 

즉,일치하는 쌍$$방정식의 일반적인 입력 형식뿐만 아니라 한 줄의 지시문도 포함됩니다 .

$$
E = mc^2
$$ 

주목: 바로 $$그렇기 때문이죠~ 아니다$$이 접근 방식으로 재정의되면 문서에 다음과 같은 인스턴스가 포함되어 있으면 문제가 발생할 수 있습니다.~ 아니다디스플레이 수학 모드를 시작하거나 종료하는 데 사용됩니다. 그러한 경우의 몇 가지 예는 다음과 같습니다.

  • $$주석에서 일치하지 않는 인스턴스 ( comment-유사 환경 포함)
  • $$축어적 환경 의 인스턴스
  • 지시어 $$에 포함된 URL 문자열 의 인스턴스\url{...}

(아직 문제가 발생할 가능성이 더 많다고 확신합니다.) 문서에 그러한 인스턴스가 있는 경우를 대비해 아래 코드는 \ReplaceDoubleDollarOffLua 함수의 작동을 끄는 매크로를 제공합니다 replace_ddollar. \ReplaceDoubleDollarOnLua 기능을 다시 켜는 이라는 동반 매크로도 있습니다 .

디스플레이 수학 모드를 시작하거나 종료할 의도가 없는 입력 라인 의 단일 인스턴스 인스턴스로 인한 위험은 디스플레이 수학 모드를 시작하거나 종료해야 하는 유일한 인스턴스가 바로 그 순간에 발생한다고 $$가정할 수 있다면 크게 줄어들 수 있습니다. $$줄 시작: 이 가정이 유효하다면 두 번째 string.gsub함수 , "%$%$"에서 검색 문자열을 로 줄이면 됩니다 "^%$%$". 문자 는 줄의 맨 처음에 일치하는 ^경우에만 일치가 발생할 수 있음을 나타냅니다 . [루아 코드에 단순한 내용이 아닌 다음 내용이 $$포함된 이유가 궁금하신 경우 : 루아에서 문자는 "특별"하므로 실제 기호를 표시하려면 (기호 앞에 기호를 추가하여) 이스케이프해야 합니다 .]%$%$$$$%$

여기에 이미지 설명을 입력하세요

% !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 정의의 동작을 $$전혀 변경하지 않습니다.

이는 일부 모드 확인을 수행하고 향상된 오류 보고를 제공하며 표시가 단락 시작 부분에 발생하는 경우 일부 간격을 변경하기 위한 \[...\]래퍼입니다 . $$...$$소스 및/또는 허용된 답변에서 전체 정의를 볼 수 있습니다.$$, \[, 정렬, 방정식 및 표시 수학의 차이점은 무엇입니까?.

따라서 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

이 솔루션은 완벽하지 않습니다. 오류 검사를 수행하지 않으며 다른 문제가 있을 수 있습니다. $ 및 활성 문자를 만들어 이를 예상하지 않는 일부 패키지를 손상시킵니다. 그러나 서문 끝 부분에 다음을 넣으면 대부분 작동할 수 있습니다. 내 문서 두 개에 시도해 보았는데 괜찮은 것 같았습니다.

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

아니면 그런 것.

관련 정보