Есть ли способ автоматически уничтожить все встроенные математические выражения (но только по вертикали)?

Есть ли способ автоматически уничтожить все встроенные математические выражения (но только по вертикали)?

Что написано на банке.

Если это недостаточно ясно, я бы хотел, чтобы $...$текст был набран как \smash{$...$}, за исключением того, что \smashэто также влияет на горизонтальный интервал (см. вопрос, на который я дал ссылку ниже), и я бы хотел, чтобы это влияло только на вертикальный интервал.

Другими словами, мне нужен какой-то код преамбулы, который выполняет две функции:

  1. Влияет \smashтолько на вертикальный интервал.
  2. Обрабатывать все экземпляры $...$как \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{$...%}, как вам нужно.

У этого подхода есть (как минимум) три ограничения, первое из которых должно быть наиболее значимым на практике.

  1. Предполагается, что встроенный математический материалвсе на одной строке-- переносы строк не допускаются. Исключений нет.

  2. Вы не должны использовать $$для инициирования и завершения режима отображения математики. Это не должно быть большим ограничением, так как вы никогда не должны использовать его $$в документе LaTeX. СмотритеПочему \[ ... \]предпочтительнее $$ ... $$?для более подробного обсуждения этой темы.

  3. Вы не используете \$для отображения символов доллара. Если вы это делаете, обязательно запустите \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}

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