Могу ли я заставить $$...$$ вести себя как \[...\]?

Могу ли я заставить $$...$$ вести себя как \[...\]?

Можно ли модифицировать LaTeX так, чтобы он $$...$$вел себя как старый добрый \[...\]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{...}директиву

(Я уверен, что есть еще больше возможностей для того, чтобы что-то пошло не так.) На всякий случай, если у вас есть такие случаи в документе, код ниже предоставляет макрос \ReplaceDoubleDollarOff, который отключает работу функции Lua replace_ddollar. Также есть сопутствующий макрос, называемый \ReplaceDoubleDollarOn, который снова включает функцию Lua.

Риск, создаваемый экземплярами отдельных экземпляров $$в строке ввода, которые не предназначены для запуска или завершения режима displaymath, может быть значительно снижен, если предположить, что единственные экземпляры, $$которые должны инициировать или завершать режим displaymath, встречаются в самом начале строки: Если это предположение верно, просто сократите строку поиска во второй 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, equal и displaymath?.

Итак, 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

Или что-то вроде того.

Связанный контент