我一直不喜欢amsmath
命令\varinjlim
和\varprojlim
分类限制。箭头太大而且太占主导地位,整个东西占用了太多的垂直空间,弄乱了行距。因此,我通常会定义自己的命令,见下文,想知道它们是否可以改进并变得更强大?在当前形式中,它们使用\raisebox
绝对尺寸,因此在索引中使用时会导致问题(见下图)。如何改进我的构造?
这个问题有一些有趣的解决方案,但其中一个使用 PGF,这对我来说似乎过于夸张,第二个在索引等中使用时无法正确扩展。哦,是的,还有一个名为的包halloweenmath
,但我不确定我是否信任具有这样名称的包。我想我更喜欢这里的一些 TeX 大师的解决方案。
\documentclass{article}
\usepackage{amsmath,graphicx}
\makeatletter
\newcommand\dirlimformat[1]{
\mathop{
\smash{
\operatorname*{#1}\limits_{
{}
\raisebox{.21em}[0pt][0pt]{\scalebox{.85}{$\m@th
\xrightarrow{%
\hphantom
{%
\!\!
\scalebox{1.17}{$\m@th
{\operatorname{#1}}
$}
\!\!
}
}
$}}
}
}
\vphantom{\textstyle\lim_n}
}
}
\newcommand\invlimformat[1]{
\mathop{
\smash{
\operatorname*{#1}\limits_{
{}
\raisebox{.21em}[0pt][0pt]{\scalebox{.85}{$\m@th
\xleftarrow{%
\hphantom
{%
\!\!
\scalebox{1.17}{$\m@th
{\operatorname{#1}}
$}
\!\!
}
}
$}}
}
}
\vphantom{\textstyle\lim_n}
}
}
\makeatother
\newcommand\dirlim{\dirlimformat{lim}}
\newcommand\invlim{\invlimformat{lim}}
\begin{document}
\( \varinjlim X_n \) vs.\ \( \dirlim X_n \)
\( \varprojlim X_n \) vs.\ \( \invlim X_n \)
\( a^{\invlim X_n} \)
\end{document}
答案1
\varinjim
和的定义\varptojlim
是amsopn.sty
\def\varinjlim{%
\mathop{\mathpalette\varlim@{\rightarrowfill@\textstyle}}\nmlimits@
}
\def\varprojlim{%
\mathop{\mathpalette\varlim@{\leftarrowfill@\textstyle}}\nmlimits@
}
因此箭头总是在 内\textstyle
。你可以使用以下方式进行自己的定义(或更改默认定义---带有常见的警告)\scriptstyle
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand\dirlim{\mathop{\mathpalette\varlim@{\rightarrowfill@\scriptstyle}}\nmlimits@}
\newcommand\invlim{\mathop{\mathpalette\varlim@{\leftarrowfill@\scriptstyle}}\nmlimits@}
\makeatother
\begin{document}
\parskip=\medskipamount
\( \varinjlim X_n \) vs.\ \( \dirlim X_n \)
\( \varprojlim X_n \) vs.\ \( \invlim X_n \)
\( a^{\varprojlim X_n} \) vs.\ \( a^{\invlim X_n} \)
\end{document}
当然,这不是最理想的\scriptscriptstyle
;你可以添加一个\mathpalette
看起来不那么糟糕的解决方法
\documentclass{article}
\usepackage{amsmath}
\makeatletter
% same as above
\newcommand\dirlimA{\mathop{\mathpalette\varlim@{\rightarrowfill@\scriptstyle}}\nmlimits@}
\newcommand\invlimA{\mathop{\mathpalette\varlim@{\leftarrowfill@\scriptstyle}}\nmlimits@}
% alternative version
\def\varlim@@#1#2{%
\vtop{\m@th\ialign{##\cr
\hfil$#1\operator@font lim$\hfil\cr
\noalign{\nointerlineskip\kern1.5\ex@}
\expandafter#2\ifx#1\scriptscriptstyle\scriptscriptstyle\else\scriptstyle\fi\cr
\noalign{\nointerlineskip\kern-\ex@}\cr}}%
}
\newcommand\dirlimB{\mathop{\mathpalette\varlim@@\rightarrowfill@}\nmlimits@}
\newcommand\invlimB{\mathop{\mathpalette\varlim@@\leftarrowfill@}\nmlimits@}
\makeatother
\begin{document}
\parskip=\medskipamount
$\varinjlim_{\varinjlim_{\varinjlim}}$
$\dirlimA_{\dirlimA_{\dirlimA}}$
$\dirlimB_{\dirlimB_{\dirlimB}}$
\end{document}
答案2
您可能想要使用old-arrows
。使用选项old
,标准箭头不会被修改,但我们可以修补\varinjlim
和\varprojlim
使用较小的箭头尖。
\documentclass{article}
\usepackage{amsmath}
\usepackage[old]{old-arrows}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\varinjlim}{\rightarrowfill@}{\varrightarrowfill@}{}{}
\xpatchcmd{\varprojlim}{\leftarrowfill@}{\varleftarrowfill@}{}{}
\makeatother
\begin{document}
\[
\rightarrow\varrightarrow\varinjlim_{x\in X} \quad \varprojlim_{x\in X}
\]
\end{document}
箭头更小:
\documentclass{article}
\usepackage{amsmath}
\usepackage[old]{old-arrows}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\varinjlim}{\rightarrowfill@}{\varrightarrowfill@}{}{}
\xpatchcmd{\varinjlim}{\textstyle}{\scriptstyle}{}{}
\xpatchcmd{\varprojlim}{\leftarrowfill@}{\varleftarrowfill@}{}{}
\xpatchcmd{\varprojlim}{\textstyle}{\scriptstyle}{}{}
\makeatother
\begin{document}
\[
\varinjlim_{x\in X} \quad \varprojlim_{x\in X}
\]
\end{document}