![Есть ли способ автоматически уничтожить все встроенные математические выражения (но только по вертикали)?](https://rvso.com/image/449635/%D0%95%D1%81%D1%82%D1%8C%20%D0%BB%D0%B8%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D1%83%D0%BD%D0%B8%D1%87%D1%82%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20(%D0%BD%D0%BE%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BF%D0%BE%20%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D0%B8)%3F.png)
Что написано на банке.
Если это недостаточно ясно, я бы хотел, чтобы $...$
текст был набран как \smash{$...$}
, за исключением того, что \smash
это также влияет на горизонтальный интервал (см. вопрос, на который я дал ссылку ниже), и я бы хотел, чтобы это влияло только на вертикальный интервал.
Другими словами, мне нужен какой-то код преамбулы, который выполняет две функции:
- Влияет
\smash
только на вертикальный интервал. - Обрабатывать все экземпляры
$...$
как\smash{$...$}
.
(Этот вопрос(Очень конкретно запрашивается как вертикальное, так и горизонтальное разбиение встроенных математических выражений, поэтому мой вариант не является его дубликатом.)
решение1
По умолчанию показанный пример будет помещаться в межстрочный интервал, поэтому нет \smash
необходимости
\documentclass{article}
\showoutput
\showboxdepth=3
\begin{document}
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
\end{document}
Производит
и журнал подтверждает \baselineskip
(а не \lineskip
) используется.
...\hbox(9.67221+1.49998)x345.0, glue set 0.34198 []
...\penalty 150
...\glue(\baselineskip) 0.8278
...\hbox(9.67221+1.49998)x345.0, glue set 0.45447 []
...\penalty 150
...\glue(\baselineskip) 0.8278
...\hbox(9.67221+1.49998)x345.0, glue set 9.86978fil []
Для большего выражения
\documentclass{article}
\showoutput
\showboxdepth=3
\begin{document}
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
\end{document}
Вы получаете
и журнал подтверждает, что TeX отказался от использования \baselineskip
:
...\hbox(10.17732+4.9484)x345.0, glue set 0.26582 []
...\penalty 150
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 0.15062 []
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 0.28621 []
...\penalty 150
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 282.19075fil []
Вы можете настроить \lineskiplimit
так, чтобы базовое пространство сохранялось, даже если линии не подходят друг к другу:
\documentclass{article}
\showoutput
\showboxdepth=3
\setlength\lineskiplimit{-\maxdimen}
\begin{document}
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
\end{document}
Это производит
и журнал
...\hbox(10.17732+4.9484)x345.0, glue set 0.26582 []
...\penalty 150
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 0.15062 []
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 0.28621 []
...\penalty 150
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 282.19075fil []
Показано, что расстояние между базовыми линиями сохраняется, даже если это приводит к появлению отрицательного пространства между строками.
Однако лекарство здесь хуже проблемы: перепечатанный неразборчивый текст с точки зрения типографики хуже, чем неравномерный межстрочный интервал.
Это (я думаю) тот эффект, которого вы хотели, прося \smash
применить его везде, но на практике лучше этого не делать и применять его только \smash
в тех местах, где вы знаете, что нет наложения (потому что высокий элемент на этой строке не выровнен с глубоким выносным элементом на строке выше, так что вы можете перекрывать ограничивающие рамки, не перекрывая текст).
решение2
Дополнительный комментарий, вызванный некоторыми комментариями OP: Если ваш документ содержит много встроенного математического материала --не то чтобы в этом было что-то плохое!-- вы можете захотеть заранееувеличиватьзначение \baselineskip
. Если значение по умолчанию \baselineskip
для используемого вами шрифта равно «120% от номинального размера шрифта» и если номинальный размер шрифта равен 10pt, вы можете выполнить
\fontsize{10}{13}\selectfont
для документа в целом, чтобы избежать большинства, если не почти всех, случаев \lineskip
необходимости увеличения сверх \baselineskip
. Конечно, случай \vec{E}
принудительного увеличения \lineskip
больше не будет иметь значения.
Предложение увеличить \baselineskip
превентивно ни в коем случае не является произвольным или хакерским. Например, в предисловии к книгеКонкретная математикаГрэма, Кнута и Паташника, который (что неудивительно) содержитмноговстроенного математического материала, текстовый шрифт Concrete Roman («египетский» вариант шрифта с засечками Computer Modern) и математический шрифт «Euler» — авторы обсуждали, что, увеличив значение \baselineskip
с 12 до 13 пунктов, они сразу же избавились почти от всех случаев, когда встроенная математика вынуждала увеличивать \lineskip
. Если типографское решение, подсказанное соображениями встроенной математики, достаточно хорошо для Кнута и его соавторов, вы, возможно, захотите проверить, «работает» ли оно и для вас, верно?
Кстати, такой \fontsize{10}{13}\selectfont
подход увеличивает ценность\baselineskip
повсюду, включая элементы документа, такие как tabular
-подобные среды, для которых увеличение \baselinskip
может не потребоваться или не быть желательным. Чтобы таблицы были аккуратными и компактными, вы можете выбрать — в качестве альтернативы запуску \fontsize{10}{13}\selectfont
— загрузку setspace
пакета (с опцией nodisplayskipstretch
) и выдать инструкцию \setstretch{1.0833}
в преамбуле. Обратите внимание, что коэффициент 1,083 все еще составляет всего треть того, что \onehalfspacing
повлечет за собой директива.
Вот решение на основе LuaLaTeX. Чтобы активировать его, выполните \SmashOn
; чтобы деактивировать его, выполните \SmashOff
. Когда \SmashOn
выполняется, функция Lua smash
назначается process_input_buffer
обратному вызову LuaTeX, где она действует как препроцессор входного потока, т.е. она делает свое делодоTeX начинает собственную обработку входного материала. "Функции", которые он выполняет, заключаются в замене всех вхождений $...$
, на \smash{$...%}
, как вам нужно.
У этого подхода есть (как минимум) три ограничения, первое из которых должно быть наиболее значимым на практике.
Предполагается, что встроенный математический материалвсе на одной строке-- переносы строк не допускаются. Исключений нет.
Вы не должны использовать
$$
для инициирования и завершения режима отображения математики. Это не должно быть большим ограничением, так как вы никогда не должны использовать его$$
в документе LaTeX. СмотритеПочему\[ ... \]
предпочтительнее$$ ... $$
?для более подробного обсуждения этой темы.Вы не используете
\$
для отображения символов доллара. Если вы это делаете, обязательно запустите\SmashOff
перед экземпляром(ами)\$
-- и\SmashOn
повторно активируйте функцию Lua, если и когда это необходимо -- или замените экземпляры\$
на\textdollar
.
Тем не менее, я не могу представить себе убедительный вариант использования для желания (вертикально) разбить весь встроенный математический материал. Если вам это требуется, вы почти наверняка делаете что-то неправильно. Если у вас есть экземпляры в e^{ikz}
встроенном математическом режиме, рассмотрите возможность замены их на \exp(ikz)
. Ваши читатели будут вам действительно благодарны, если вы это сделаете.
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath} % for '\dfrac' macro
\usepackage{lipsum} % filler text
\usepackage{luacode} % for 'luacode' env.
\begin{luacode}
function smash ( s )
return ( s:gsub ( "%b$$" , "\\smash{%1}" ) )
end
\end{luacode}
\newcommand\SmashOn{\directlua{luatexbase.add_to_callback (
"process_input_buffer", smash, "smash" )}}
\newcommand\SmashOff{\directlua{luatexbase.remove_from_callback (
"process_input_buffer", "smash" )}}
\begin{document}
\hrule % draw line to illustrate width of textblock
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\SmashOn % activate the Lua function
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\SmashOff % deactivate the Lua function
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\end{document}