测量 \int 的间距

测量 \int 的间距

我希望能够测量一个 占用的空间,\int并将该长度存储在 中\newlength{}。这并不像

\settowidth{\@IntWidth}{\widthof{$\int$}}

在下面的 MWE 中,我尝试应用\kern测量间距的负数,并用红色重新绘制符号。如果测量正确,红色符号应该正好位于黑色符号的上方,但我得到了:

在此处输入图片描述

笔记:

  • 这仅解决给定上限和下限的情况,因此处理其他选项的代码被注释掉。

代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{calc}
\usepackage{xcolor}
\usepackage{xparse}

\newcommand{\dx}{\mathrm{d}x}%

\makeatletter
\let\OldIntOp\int
\newlength{\@IntWidth}

%% https://tex.stackexchange.com/a/345383/4301
\RenewDocumentCommand\int{e{_^}}{% underscore ALWAYS before ^
  %\IfNoValueTF{#2}{% No upper limit
  %  \IfNoValueTF{#1}{% No lower and upper limit
  %    \OldIntOp
  %  }{% Only lower limit
  %    \OldIntOp_{#1}
  %  }
  %}{
  %  \IfNoValueTF{#1}{% No lower, but do have upper limit
  %    \OldIntOp^{#2}
  %  }{% Both lower and upper limit
      \OldIntOp
      \settowidth{\@IntWidth}{\widthof{$\OldIntOp$}}% ????? How compute this ??????
      \kern-\@IntWidth
      {\color{red} \OldIntOp_{#1}^{#2}}
  % }
  %}%
}\makeatother

\begin{document}
\noindent
In inline math $\OldIntOp_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\OldIntOp^b_a  y\dx
    \textstyle\OldIntOp_a^b  y\dx
    \scriptstyle\OldIntOp_a^b  y\dx
    \scriptscriptstyle\OldIntOp_a^b  y\dx
    &
\end{flalign*}
In inline math $\int_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\int^b_a  y\dx
    \textstyle\int_a^b  y\dx
    \scriptstyle\int_a^b  y\dx
    \scriptscriptstyle\int_a^b  y\dx
    &
\end{flalign*}
\end{document}

答案1

不确定您想要得到什么。无论如何,可以使用来计算宽度\mathpalette(还有一个\!要添加的,很可能是一些\mathop诡计)。

\documentclass{article}
\usepackage{amsmath}
\usepackage{calc}
\usepackage{xcolor}
\usepackage{xparse}

\newcommand{\dx}{\mathrm{d}x}%

\makeatletter
\let\OldIntOp\int

\newcommand\kernint{\mathpalette\@kernint\relax}
\newcommand\@kernint[2]{%
  \!\sbox0{$\m@th#1\OldIntOp$}\kern-\wd0
}

%% https://tex.stackexchange.com/a/345383/4301
\RenewDocumentCommand\int{e{_^}}{% underscore ALWAYS before ^
  %\IfNoValueTF{#2}{% No upper limit
  %  \IfNoValueTF{#1}{% No lower and upper limit
  %    \OldIntOp
  %  }{% Only lower limit
  %    \OldIntOp_{#1}
  %  }
  %}{
  %  \IfNoValueTF{#1}{% No lower, but do have upper limit
  %    \OldIntOp^{#2}
  %  }{% Both lower and upper limit
      \OldIntOp\kernint
      {\color{red} \OldIntOp_{#1}^{#2}}
  % }
  %}%
}
\makeatother

\begin{document}
\noindent
In inline math $\OldIntOp_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\OldIntOp^b_a  y\dx
    \textstyle\OldIntOp_a^b  y\dx
    \scriptstyle\OldIntOp_a^b  y\dx
    \scriptscriptstyle\OldIntOp_a^b  y\dx
    &
\end{flalign*}
In inline math $\int_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\int^b_a  y\dx
    \textstyle\int_a^b  y\dx
    \scriptstyle\int_a^b  y\dx
    \scriptscriptstyle\int_a^b  y\dx
    &
\end{flalign*}
\end{document}

\makeatother

\begin{document}
\noindent
In inline math $\OldIntOp_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\OldIntOp^b_a  y\dx
    \textstyle\OldIntOp_a^b  y\dx
    \scriptstyle\OldIntOp_a^b  y\dx
    \scriptscriptstyle\OldIntOp_a^b  y\dx
    &
\end{flalign*}
In inline math $\int_a^b  y\dx$, and in display math it is:
\begin{flalign*}
    &\displaystyle\int^b_a  y\dx
    \textstyle\int_a^b  y\dx
    \scriptstyle\int_a^b  y\dx
    \scriptscriptstyle\int_a^b  y\dx
    &
\end{flalign*}
\end{document}

在此处输入图片描述

答案2

如果您对数学框的实际测量感兴趣,以下示例测量数学公式并将其尺寸写入文件。这解决了/在所有数学样式中设置公式.aux的限制,但 TeX 稍后会决定使用哪个版本(感谢和朋友)。\mathpalette\mathchoice\over

\documentclass{article}
\usepackage{color}
\newcommand*{\diff}{\mathop{}\!\mathrm{d}}

\makeatletter

% Create new label type for the .aux file that takes
% the measurements of the math box.
% LaTeX takes care of re-run warnings Because of the usage of \@newl@bel.
\usepackage{auxhook}
\AddLineBeginAux{%
  \string\providecommand\string\New@MeasureMathBox[2]{}%
}
\newcommand*{\New@MeasureMathBox}{%
  \@newl@bel{mmb}%
}

% Counter for identifying a math box
\newcounter{MeasureMathBox}
\renewcommand*{\theMeasureMathBox}{\the\value{MeasureMathBox}}

% Register that contain the measurement result
\newdimen\LastMathBoxWidth
\newdimen\LastMathBoxHeight
\newdimen\LastMathBoxDepth

% Measure the math box and write the label
% with the measurements to the .aux file
% in all styles via \mathpalette.
% When TeX later decides, which box it uses,
% only one write command of the correct
% math style remains.
\newcommand*{\MeasureMathBox}{%
  % #1: math formula to be measured
  % New identifier for the math box.
  \stepcounter{MeasureMathBox}%
  % Read the label if available.
  \@ifundefined{mmb@\theMeasureMathBox}{%
    \LastMathBoxWidth\z@
    \LastMathBoxHeight\z@
    \LastMathBoxDepth\z@
  }{%
    \expandafter\expandafter\expandafter
    \Extract@MeasureMathBox
    \csname mmb@\theMeasureMathBox\endcsname\@nil
  }%
  \mathpalette\@MeasureMathBox
}
\def\Extract@MeasureMathBox#1,#2,#3\@nil{%
  \LastMathBoxWidth#1\relax
  \LastMathBoxHeight#2\relax
  \LastMathBoxDepth#3\relax
}
\newcommand*{\@MeasureMathBox}[2]{%
  % #1: math style
  % #2: math formula to be measured
  % Do the actual measurement.
  \setbox0=\hbox{$#1#2\m@th$}%
  % Write the label to the .aux file.
  \protected@write\@auxout{}{%
    \string\New@MeasureMathBox
    {\theMeasureMathBox}%
    {\the\wd0,\the\ht0,\the\dp0}%
  }%
}
\makeatother

\begin{document}

\def\Test{
  \int
  \MeasureMathBox{\int}
  \kern-\LastMathBoxWidth
  \! % negate horizontal spacing between two operators
  \begingroup\color{red} \int_a^b \endgroup y\diff x
}
\[ \Test \]
\[ \textstyle \Test \]
\[ \scriptstyle \Test \]
\[ \scriptscriptstyle \Test \]
\end{document}

第一次编译运行后,该.aux文件包含:

\relax
\providecommand\New@MeasureMathBox[2]{}
\New@MeasureMathBox{1}{10.00002pt,13.61122pt,8.61124pt}
\New@MeasureMathBox{2}{6.66667pt,8.0556pt,3.05562pt}
\New@MeasureMathBox{3}{6.66667pt,7.3056pt,3.80562pt}
\New@MeasureMathBox{4}{6.66667pt,6.8056pt,4.30562pt}

这在第二次编译运行中使用:

结果

如果你只对插入数学公式的负空间感兴趣,下面的操作可以在一次编译运行中完成(类似于 egreg 的回答,但更为通用):

\documentclass{article}
\usepackage{color}
\newcommand*{\diff}{\mathop{}\!\mathrm{d}}

\makeatletter
\newcommand*{\NegMathWidth}{%
  % #1: math formula to be measured
  \mathpalette{\@NegMathWidth}%
}
\newcommand*{\@NegMathWidth}[2]{%
  % #1: math style
  % #2: math formula to be measured
  \settowidth\dimen@{$#1#2\m@th$}%
  \kern-\dimen@
}
\makeatother

\begin{document}
\def\Test{
  \int
  \NegMathWidth{\int}
  \! % negate horizontal spacing between two operators
  \begingroup\color{red} \int_a^b \endgroup y\diff x
}
\[ \Test \]
\[ \textstyle \Test \]
\[ \scriptstyle \Test \]
\[ \scriptscriptstyle \Test \]
\end{document}

结果和上面一样。

相关内容