编辑:

编辑:

我有一段文字,其中包含一个“深”数学符号,该符号略低于文本的正常底部。最初,该符号下方没有任何内容;它位于倒数第二行的段落末尾附近,下面的行没有延伸到有问题的符号的水平位置。段落最后两行之间的间距太大,所以我过去常常将\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}

相关内容