我有一段文字,其中包含一个“深”数学符号,该符号略低于文本的正常底部。最初,该符号下方没有任何内容;它位于倒数第二行的段落末尾附近,下面的行没有延伸到有问题的符号的水平位置。段落最后两行之间的间距太大,所以我过去常常将\smash
其重置为“正常”。
后来,我在段落末尾添加了一些文本。现在\smash
间距太小了。但没有\smash
间距对我来说仍然感觉太大了。如果有一个\halfsmash
版本\smash
可以将符号的“高度”(分别是“深度”)调整到其真实高度(深度)和同一行上普通连续文本的当前高度(深度)的中间位置,那不是很好吗?
就像\smash
,无论在数学模式中还是在数学模式之外使用,这都可以正常工作。在显示数学模式下,它可能效果不佳,但这不是设计目标的一部分。对于跨行的内容,它可能不起作用。
加分项:
- 接受一个可选参数,该参数以比例指定真实高度/深度和行高/深度之间的所需差异(默认为一半)。(因此,
\halfsmash[0.25]{content}
将给出{content}
真实高度和文本当前行高之间的四分之一的高度,以及真实深度和文本当前行深之间的四分之一的深度。\halfsmash[1]{...}
就像\smash{...}
,并且\halfsmash[0]
不会产生任何效果。) - 与 amsmath 扩展兼容,
\smash
它提供了可选参数[t]
和[b]
。 - 我不知道它是否
\smash
在下标/上标上下文中正常工作。如果可以,那么也认为这是可取的。
我开始考虑这样做,但很快意识到
- 它需要处理符号的高度和深度
- 它要求测试在调用宏时 TeX 是否处于数学模式(不过我发现有一个宏
\ifmmode
可以用于此) - 它要求您找出当前行文本的“默认”高度和深度(我不确定您如何做到这一点)
- 一种可行的方法将涉及使用数学扩展(可能是 PGF)在两个不同的高度/深度之间进行插值,然后可能使用它
\raisebox
来获得具有正确高度/深度的盒子。
编辑:
这是我的尝试。不幸的是,我第一个障碍就失败了 - 它甚至没有编译(\equal
出于某种原因,在这种情况下似乎对我来说不可用)。
\documentclass[a4paper]{amsart}
\usepackage{ifthen, pgf, xparse}
\newlength{\lenA}
\newlength{\lenB}
\newlength{\lenC}
\newlength{\lenD}
\DeclareDocumentCommand{\halfsmash}{oom}{%
\begingroup
% Wrap the {content} in $...$, if in math mode.
\edef\c{\ifmmode$#3$\else#3\fi}%
% Determine the proportion, \x.
\edef\x{%
\IfNoValueTF {#1}%
{0.5}%
{\ifthenelse {\equal{#1}{t}}%
{\IfNoValueTF{#2}{0.5}{#2}}%
{\ifthenelse {\equal{#1}{b}}%
{\IfNoValueTF{#2}{0.5}{#2}}%
{#1}}}%
}%
% Determine whether to modify height, depth, or both; obtain a proportion (0 or 1) by
% which the height is to be changed (not using \x at this stage).
\edef\h{\IfNoValueTF{#1}{1}{\ifthenelse{\equal{#1}{b}}{0}{1}}}%
\edef\d{\IfNoValueTF{#1}{1}{\ifthenelse{\equal{#1}{t}}{1}{0}}}%
\settoheight{\lenA}{G}% The "ordinary" height of the current line.
\settodepth{\lenB}{g}% The "ordinary" depth of the current line.
\settoheight{\lenC}{\c}% The true height of the {content}.
\settodepth{\lenD}{\c}% The true depth of the {content}.
\pgfmathsetlength{\lenA}{\lenC - (\x * \h * (\lenC - \lenA))}%
\pgfmathsetlength{\lenB}{\lenD - (\x * \d * (\lenD - \lenB))}%
% Typeset the {content}.
\raisebox{0pt}[\lenA][\lenB]{\c}%
\endgroup%
}
\newcommand{\tallmathsymbol}{\Sigma^{x^{y^z}}_{a_{b_c}}}
\newcommand{\sometext}{%
Here is some text.
Its only purpose is to be repeated several times, so as to form a paragraph.
}
\begin{document}
\sometext\sometext\sometext\sometext\sometext$\tallmathsymbol$
\sometext\sometext\sometext\sometext\sometext
\sometext\sometext\sometext\sometext\sometext\halfsmash{$\tallmathsymbol$}
\sometext\sometext\sometext\sometext\sometext
\sometext\sometext\sometext\sometext\sometext$\halfsmash[0.25]{\tallmathsymbol}$
\sometext\sometext\sometext\sometext\sometext
\sometext\sometext\sometext\sometext\sometext$\halfsmash[b]{\tallmathsymbol}$
\sometext\sometext\sometext\sometext\sometext
\sometext\sometext\sometext\sometext\sometext\halfsmash[t][0.25]{$\tallmathsymbol$}
\sometext\sometext\sometext\sometext\sometext
\end{document}
答案1
这里是对 amsmath 命令的修改\smash
,它允许“部分”粉碎,并将分数作为参数提供:
\documentclass{amsart}
\makeatletter
\newcommand{\partsmash}[2][tb]{%
\def\mb@t{\ht\z@ #2\ht\z@}\def\mb@b{\dp\z@ #2\dp\z@}%
\def\mb@tb{\mb@t \mb@b}%
\edef\finsm@sh{\csname mb@#1\endcsname\box\z@}%
\ifmmode \@xp\mathpalette\@xp\mathsm@sh
\else \@xp\makesm@sh
\fi}
\makeatother
\begin{document}
\fboxsep=0pt
\fbox{$\intop$} \fbox{$\smash\intop$}
\fbox{$\smash[t]\intop$} \fbox{$\smash[b]\intop$}
\fbox{$\intop$} \fbox{$\partsmash{.4}\intop$}
\fbox{$\partsmash[t]{.4}\intop$} \fbox{$\partsmash[b]{.4}\intop$}
\end{document}
答案2
在这里,我粉碎了实际显示的项目,然后放置一个\vphantom
缩小比例(默认 0.5 大小,但可以用可选参数指定)
\documentclass{article}
\usepackage{graphicx}
\usepackage{lipsum}
\newcommand\halfsmash[2][.5]{\smash{#2}\vphantom{\scalebox{#1}{#2}}}
\begin{document}
\lipsum*[4]%
{\Huge Ay}
\lipsum*[4]
{\Huge\halfsmash{Ay}}
\lipsum*[4]
{\Huge\halfsmash[.8]{Ay}}
\lipsum*[4]
{$\displaystyle\int_0^\infty y dx$}
\lipsum*[4]
{\halfsmash[.8]{$\displaystyle\int_0^\infty y dx$}}
\lipsum*[4]
\end{document}
答案3
这是我在编辑该问题时所做的尝试的工作版本。
我确信有人会提出比我的更好的版本。
我不知道我对 0 代表“无影响”和 1 代表“喜欢\smash
”有什么看法。我不确定是否应该反过来(当然,这只是改变算术的简单问题)。我无法决定哪个更直观。
\documentclass[a4paper]{amsart}
\usepackage{ifthen, pgf, xparse}
\newlength{\lenA}
\newlength{\lenB}
\newlength{\lenC}
\newlength{\lenD}
\DeclareDocumentCommand{\halfsmash}{oom}{%
\begingroup
% Wrap the {content} in $...$, if in math mode.
\ifmmode\def\c{$#3$}\else\def\c{#3}\fi%
% Using the optional arguments, if present, determine whether to modify height, depth,
% or both, and by how much.
\IfNoValueTF {#1}%
{\def\h{0.5}\def\d{0.5}}%
{\IfNoValueTF {#2}%
{\ifthenelse {\equal{#1}{t}}%
{\def\h{0.5}\def\d{0}}%
{\ifthenelse {\equal{#1}{b}}%
{\def\h{0}\def\d{0.5}}%
{\def\h{#1}\def\d{#1}}}}%
{\ifthenelse {\equal{#1}{t}}%
{\def\h{#2}\def\d{0}}%
{\def\h{0}\def\d{#2}}}}%
\settoheight{\lenA}{G}% The "ordinary" height of the current line.
\settodepth{\lenB}{g}% The "ordinary" depth of the current line.
\settoheight{\lenC}{\c}% The true height of the {content}.
\settodepth{\lenD}{\c}% The true depth of the {content}.
\pgfmathsetlength{\lenA}{\lenC - (\h * (\lenC - \lenA))}%
\pgfmathsetlength{\lenB}{\lenD - (\d * (\lenD - \lenB))}%
% Typeset the {content}.
\raisebox{0pt}[\lenA][\lenB]{\c}%
\endgroup%
}
\newcommand{\tallmathsymbol}{\Sigma^{P^{Q^{R^{S^T}}}}_{A_{B_{C_{D_E}}}}}
\newcommand{\sometext}{%
Here is some text.
Its only purpose is to be repeated several times, so as to form a paragraph.
}
\edef\sometext{\sometext\sometext}
\begin{document}
\sometext$\tallmathsymbol$\sometext
\sometext\smash{$\tallmathsymbol$}\sometext
\sometext\halfsmash{$\tallmathsymbol$}\sometext
\sometext$\halfsmash[0.25]{\tallmathsymbol}$\sometext
\sometext$\halfsmash[b]{\tallmathsymbol}$\sometext
\sometext\halfsmash[t][0.25]{$\tallmathsymbol$}\sometext
\end{document}