点导数差异

点导数差异

我正在尝试使用点符号排版一些高阶时间导数,我发现了一些奇怪的事情。表达式

$\dot y + y = \cos(\dot y)$
$\ddot y + y = \cos(\dot y)$

给出预期结果。然而,

$\dddot y + y = \cos(\dot y)$
$\ddddot y + y = \cos(\dot y)$

导致高阶导数项略有升高,见下文。有什么想法吗?

在此处输入图片描述

以下是我的序言:

\documentclass{article}
\usepackage{amsmath, amssymb, amsfonts, amsthm, fouriernc}

答案1

放置问题源于以下事实:和都\dddot\ddddot其参数构造为,\mathop以便在其上方放置“限制”。但是,\mathop如果参数是单个字符,则将其内容垂直居中在数学轴上(参见mathop 移动基线,而 DeclareMathOperator 不移动) - 一个特征。

因此,你应该通过添加(比如说)来欺骗 LaTeX,让它认为它实际上不只是一个字符\hspace{0pt}

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath, amssymb, amsfonts, amsthm, fouriernc}
\begin{document}
\begin{enumerate}
  \item $\dot{y} + y = \cos(\dot y)$
  \item $\ddot{y} + y = \cos(\dot y)$
  \item $\dddot{y\hspace{0pt}} + y = \cos(\dot y)$
  \item $\ddddot{y\hspace{0pt}} + y = \cos(\dot y)$
\end{enumerate}
\end{document}

可以通过在后面添加以下代码来自动纠正行为\usepackage{amsmath}

\makeatletter
\renewcommand{\dddot}[1]{%
  {\mathop{\kern\z@#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
   \hbox{\normalfont ...}\vss}}}}
\renewcommand{\ddddot}[1]{%
  {\mathop{\kern\z@#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
   \hbox{\normalfont....}\vss}}}}
\makeatother

答案2

简短的回答

该软件包修复了和accents的这个错误行为(以及其他一些问题;见下文)。如果这些版本仍然不能让您满意,请尝试本答案末尾的代码。\dddot\ddddotaccents

详细答案

Werner 很好地解释了垂直定位问题是如何产生的,以及如何修复它。我想讨论一下我在 和 中发现的几个(不那么显眼的)问题\dddot\ddddot这些问题也发生在没有使用该fouriernc包(这还会导致过大的点,正如 Mico 在对该问题的评论中所指出的那样),所以我没有加载fouriernc以生成下面的屏幕截图。

  1. 比较 dddot 与 y 上的 ddot  正如我们在图像中所看到的,中的点\dddot{y\hspace{0pt}}比中的点要远得多\ddot{y}。(我不认为这是故意的。)

  2. 如果仔细观察,就会\dddot发现更高比来自的要多\ddot

  3. 随着\dddot\ddddot水平的我认为,点的定位也不令人满意。也就是说,这些命令没有考虑到歪斜字符的数学重音\dot\ddotdo。这在上面的图中并不明显y,但比较\dddot{J\hspace{0pt}}\ddot{J}就很清楚了: 比较 dddot 与 J 上的 ddot(这是不是修复的错误\hspace{0pt}

  4. \dddot\ddddot在下标和上标中无法正常工作:点的大小和间距与 中相同\textstyle。但我认为这里没有真正的问题,因为无论如何都不应该在下标和上标中使用这些命令。

  5. 过于请注意,\dddot(黑色)中的点比(红色)中的点大几个百分点\ddot。此外,的边界框\dddot{y}不够高。后者可能这可能是一个小问题,但我没有遇到任何问题。
    迂腐的


该包通过适当重新定义和accents解决了上述一些问题。特别是,点的位置像重音符号一样,考虑到倾斜,点之间的距离更近了。对于,它们实际上比在中明显更接近。总而言之,它看起来好多了:\dddot\ddddot\ddddot\ddot

带有 accents 包的示例

\ddddot{l}可以清楚地看到,在上述公式的右侧,必须留出一些额外的空间。原因是这些点的定义方式使得它们不占用水平空间。(这是\ddddot被定义为数学重音符号的副作用。)在左侧,这种行为导致左侧有很好的间距。

问题 #2 未被修复accents:奇怪的是,该包设置了一点点降低\ddot。实际上,这些点被降低的程度比被升高的程度要多一些amsmath。此外,列表中的第 4 点不是相当已修复,最明显的一点是\dddot不能正常工作,\scriptstyle因为定义包含\textstyle应该被删除的:

\def\dddot{\accentset{{\cc@style.\mkern-1.7mu\textstyle.\mkern-1.7mu.}}}

如果您对软件包中的版本仍不太满意,那么您可以使用我下面accents的实现,它修复了上述所有问题(除了 #5 中提到的点尺寸略大)。该代码只能与一起使用,因为它会侵入 的重音位置(\dddot\ddddot:-)amsmathamsmath就像这里一样)。在下图中,我将我的实现(第 1 行)与accents(第 2 行)和amsmath(第 3 行)实现进行了比较。(请注意,我没有使用 Werner 的修复方法amsmath。)

三种实现方式的比较

\documentclass{article}
\usepackage{amsmath}%, fouriernc}
\let\amsdddot\dddot
\let\amsddddot\ddddot
\usepackage{accents}
\let\accdddot\dddot
\let\accddddot\ddddot
\makeatletter
\renewcommand*\dddot[1]{%
  \placeaccent{\acc@dot\mkern1.4mu\acc@dot\mkern1.4mu\acc@dot}{#1}%
  }
\renewcommand*\ddddot[1]{%
  \placeaccent{\acc@dot\mkern1.4mu\acc@dot\mkern1.4mu\acc@dot\mkern1.4mu\acc@dot}{#1}%
  }
\newcommand*\placeaccent[2]{%
  \begingroup
  \def\acc@dot{\kern-0.08em.\kern-0.08em}%
  \def\acc@skip{\ifx\macc@style\displaystyle0.32
           \else\ifx\macc@style\textstyle0.32
           \else\ifx\macc@style\scriptstyle0.22
           \else0.15\fi\fi\fi ex}%
  \def\mathaccent##1##2{%
    \setbox6\hbox{$\m@th\macc@style#1$}%
    \@tempdima\wd4
    \advance\@tempdima\macc@kerna
    \advance\@tempdima-\wd6
    \divide\@tempdima\tw@
    \@tempdimb\z@
    \ifdim\@tempdima<\z@ \@tempdimb-\@tempdima \@tempdima\z@ \fi
    \vbox{\offinterlineskip
          \moveright\@tempdima\box6
          \kern\acc@skip
          \moveright\@tempdimb\box4}%
  }%
  \macc@depth\@ne
  \let\math@bgroup\@empty \let\math@egroup\macc@set@skewchar
  \mathsurround\z@ \frozen@everymath{\mathgroup\macc@group\relax}%
  \macc@set@skewchar\relax
  \let\mathaccentV\macc@nested@a
  \macc@nested@a\relax111{#2}%
  \endgroup
}
\makeatother
\begin{document}
\fboxrule0.0001pt
\fboxsep0pt
\begin{enumerate}
\item $\dot y + \ddot y + \dddot y + \ddddot{y} = \cos(\ddddot l)$,
      \quad \fbox{$\dddot{y}$}, \quad
      $\ddot{A}_{\dddot{x}_{\ddddot{x}}} \ne \dddot{A}_{\ddot{x}_{\dot{x}}}$
\let\dddot\accdddot
\let\ddddot\accddddot
\item $\dot y + \ddot y + \dddot y + \ddddot{y} = \cos(\ddddot l)$,
      \quad \fbox{$\dddot{y}$}, \quad
      $\ddot{A}_{\dddot{x}_{\ddddot{x}}} \ne \dddot{A}_{\ddot{x}_{\dot{x}}}$
\let\dddot\amsdddot
\let\ddddot\amsddddot
\item $\dot y + \ddot y + \dddot y + \ddddot{y} = \cos(\ddddot l)$,
      \quad \fbox{$\dddot{y}$}, \quad
      $\ddot{A}_{\dddot{x}_{\ddddot{x}}} \ne \dddot{A}_{\ddot{x}_{\dot{x}}}$
\end{enumerate}
\end{document}

答案3

Unicode 为这些字符提供了专门的重音字符:0x20DB0x20DC

因此,使用unicode-math\dddot\ddddot应该可以正常工作。需要注意的是, 的作者 Will Robertsonunicode-math在 README 中指出:

我不太愿意鼓励人们使用这个包进行生产工作

尽管如此,Unicode 肯定未来之路™

答案4

如果愿意,您可以嵌套点命令,例如\dot{\ddot{y}}三阶导数。

相关内容