すべてのインライン数式を自動的に(ただし垂直方向にのみ)圧縮する方法はありますか?

すべてのインライン数式を自動的に(ただし垂直方向にのみ)圧縮する方法はありますか?

缶に書いてある通りです。

十分に明確でない場合に備えて、$...$を とタイプセットしたいのです\smash{$...$}が、 は\smash水平方向の間隔にも影響し(以下にリンクした質問を参照)、垂直方向の間隔にのみ影響するようにしたいと思います。

言い換えれば、次の 2 つのことを実行するプリアンブル コードが必要です。

  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デフォルト値が「公称フォントサイズの120%」で、公称フォントサイズが10ptの場合、次のように実行できます。\baselineskip

\fontsize{10}{13}\selectfont

文書全体に対して、 を\lineskip超えて増加しなければならないケースのほとんど、あるいはすべてを回避するために、を強制的に増加させる\baselineskipケースはもはや関係なくなるでしょう。\vec{E}\lineskip

先手を打って増やすという提案は、\baselineskip決して恣意的でも、ハックでもありません。例えば、この本の序文では、具体的な数学グラハム、クヌース、パタシュニックによるもので、(当然ながら)たくさんインライン数式素材の 、Concrete Roman テキスト フォント (Computer Modern のスラブ セリフ フォントの「Egyptienne」)、および「Euler」数式フォントについて、著者らは、 の値を\baselineskip12pt から 13pt に増やすことで、 の増加を余儀なくされるインライン数式のほとんどすべてのケースを即座に取り除くことができると説明しました\lineskip。インライン数式を考慮して導き出されたタイポグラフィ ソリューションが Knuth と共著者にとって十分であるなら、あなたもそれが「機能する」かどうか試してみたいと思いませんか?

ちなみに、この\fontsize{10}{13}\selectfontアプローチは、\baselineskip どこにでも、のような環境などのドキュメント要素も含みますtabular。これらのドキュメント要素では、 の増加は\baselinskip不要または望ましくありません。テーブルをすっきりとコンパクトに保つ​​には、 を実行する代わりに、パッケージ\fontsize{10}{13}\selectfontをロードしsetspace(オプション を使用nodisplayskipstretch)、プリアンブルで命令を発行することを選択できます\setstretch{1.0833}。係数 1.083 は、ディレクティブに必要な値の 3 分の 1 にすぎないことに注意してください\onehalfspacing


これはLuaLaTeXベースのソリューションです。これを有効にするには を実行し\SmashOn、無効にするには を実行します\SmashOff\SmashOnが実行されると、Lua関数はsmashLuaTeXのコールバックに割り当てられprocess_input_buffer、入力ストリームのプリプロセッサとして機能します。つまり、必要な処理を実行します。前にTeX は入力された素材の独自の処理を開始します。 TeX が行う「処理」は、要求どおりに、のすべてのインスタンスを$...$に置き換えることです。\smash{$...%}

このアプローチには (少なくとも) 3 つの制限があり、そのうちの最初の制限が実際には最も関連があるはずです。

  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}

関連情報