Можно ли модифицировать 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.
По моему мнению, если вам нужно поведение \[...\]
, просто используйте \[...\]
. Переопределение $$
, хотя технически и возможно, нетривиально, поскольку сама команда, определяющая желаемое поведение, использует его внутри. Кроме того, неизвестно, сколько (иногда плохо спроектированных, но тем не менее) документов полагаются на старую функциональность.
решение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
Или что-то вроде того.