我正在尝试使用点符号排版一些高阶时间导数,我发现了一些奇怪的事情。表达式
$\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
\ddddot
accents
详细答案
Werner 很好地解释了垂直定位问题是如何产生的,以及如何修复它。我想讨论一下我在 和 中发现的几个(不那么显眼的)问题\dddot
。\ddddot
这些问题也发生在没有使用该fouriernc
包(这还会导致过大的点,正如 Mico 在对该问题的评论中所指出的那样),所以我没有加载fouriernc
以生成下面的屏幕截图。
正如我们在图像中所看到的,中的点
\dddot{y\hspace{0pt}}
比中的点要远得多\ddot{y}
。(我不认为这是故意的。)如果仔细观察,就会
\dddot
发现更高比来自的要多\ddot
。随着
\dddot
和\ddddot
,水平的我认为,点的定位也不令人满意。也就是说,这些命令没有考虑到歪斜字符的数学重音\dot
和\ddot
do。这在上面的图中并不明显y
,但比较\dddot{J\hspace{0pt}}
和\ddot{J}
就很清楚了: 。(这是不是修复的错误\hspace{0pt}
。\dddot
和\ddddot
在下标和上标中无法正常工作:点的大小和间距与 中相同\textstyle
。但我认为这里没有真正的问题,因为无论如何都不应该在下标和上标中使用这些命令。在过于请注意,
\dddot
(黑色)中的点比(红色)中的点大几个百分点\ddot
。此外,的边界框\dddot{y}
不够高。后者可能这可能是一个小问题,但我没有遇到任何问题。
该包通过适当重新定义和accents
解决了上述一些问题。特别是,点的位置像重音符号一样,考虑到倾斜,点之间的距离更近了。对于,它们实际上比在中明显更接近。总而言之,它看起来好多了:\dddot
\ddddot
\ddddot
\ddot
\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
:-)
amsmath
amsmath
就像这里一样)。在下图中,我将我的实现(第 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 为这些字符提供了专门的重音字符:0x20DB
和0x20DC
。
因此,使用unicode-math
,\dddot
和\ddddot
应该可以正常工作。需要注意的是, 的作者 Will Robertsonunicode-math
在 README 中指出:
我不太愿意鼓励人们使用这个包进行生产工作
尽管如此,Unicode 肯定未来之路™。
答案4
如果愿意,您可以嵌套点命令,例如\dot{\ddot{y}}
三阶导数。