请考虑以下代码:
\documentclass[a4paper]{article}
\usepackage{ngerman}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\newcommand{\uunderline}[1]{\underline{\underline{#1}}}
\begin{document}
\[
s=\left(
a_1,
\underset{\big\uparrow}{a_2},
a_3,
\uunderline{a_4},
a_5,
a_6
\underset{\underset{\big{a_0}}{\big\uparrow}}{,}
a_7,
d^{\left(k\right)},
a_8,
a_9
\right)
\]
\end{document}
- 如您所见,
\underset
逗号周围产生了难看的间距。 是否有可能避免这种情况,以便逗号及其间距都相同? - 是否可以让左/右括号不考虑“
\underset
/\uparrow
”? - 使用我的 Miktex 发行版时,pdflatex 会抛出错误:
Missing delimiter (. inserted). ...set{\underset{\big{a_0}}{\big\uparrow}}{,}
。我猜这与有关,\big
但如果忽略它,则会a_0
变得太小(期望的大小与其他的大小相同a_i
)。我该如何解决这个问题?
答案1
该stackengine
包有一个明确的定义\useanchorwidth
,如果设置了T
rue),则忽略堆叠材料的宽度,只采用“锚”材料的宽度。当然,您必须使用语法stackengine
。
可以使用可选参数来改变下划线的间隙,如术语的情况所示a_0
。
\documentclass[a4paper]{article}
\usepackage{ngerman}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{stackengine}
\def\useanchorwidth{T}
\stackMath
\newcommand{\uunderline}[1]{\underline{\underline{#1}}}
\begin{document}
\[
s=\bigl(
a_1,
\stackunder{a_2}{\scriptstyle\big\uparrow},
a_3,
\uunderline{a_4},
a_5,
a_6
\stackunder[8pt]{,{}}{\stackunder{\scriptstyle\big\uparrow}{a_0}}
a_7,
d^{\left(k\right)},
a_8,
a_9
\bigr)
\]
\end{document}
答案2
这种方法需要mathtools
而不是amsmath
。
\underset
可以使用来忽略这两个元素\smash
;请注意,如果要在此方程式下方打印某些内容,则必须稍后补偿这个被消除的深度。由于任一粉碎元素的高度都不大于未粉碎元素的高度,因此不需要补偿。
通过将a_0
第二个箭头设置在 中,可以将它恢复到正常大小\mbox
,它不会缩放,并且可以通过在 内设置所有内容来忽略它的宽度\mathclap
。
由于箭头也比逗号宽,所以也需要用 括起来\mathclap
,但这会使该元素的宽度有点窄,所以逗号看起来太紧。因此,整个元素的类被重置为以\mathpunct
恢复正确的逗号行为。
最后,\mbox
eda_0
比不加框时更靠近箭头,因此\mathstrut
插入 a 来恢复高度。
有点复杂,但它为分割数学结构并以适当的间距将它们重新组合提供了很好的练习。
\documentclass[a4paper]{article}
\usepackage{ngerman}
\usepackage[utf8]{inputenc}
%\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amssymb}
\newcommand{\uunderline}[1]{\underline{\underline{#1}}}
\begin{document}
\thispagestyle{empty}
\[
s=\left(
a_1,
\smash{\underset{\big\uparrow}{a_2}},
a_3,
\uunderline{a_4},
a_5,
a_6
\mathpunct{
\smash{\underset{\mathclap{\underset{\mbox{$a_0\mathstrut$}}{\big\uparrow}}}{,}}}
a_7,
d^{\left(k\right)},
a_8,
a_9
\right)
\vphantom{\underset{\mathclap{\underset{\mbox{$a_0\mathstrut$}}{\big\uparrow}}}{,}}
\]
\end{document}
编辑:
受评论提示,\vphantom
已添加,以便显示后的文本将正确间隔。(同样,未经测试。)
答案3
只是不要使用\left
和\right
,同时以不同的方式修复底集。
\documentclass[a4paper]{article}
\usepackage{ngerman}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\newcommand{\uunderline}[1]{\underline{\underline{#1}}}
\begin{document}
\[
s=\bigl(
a_1,
\underset{\big\uparrow}{a_2},
a_3,
\uunderline{a_4},
a_5,
a_6
\mathpunct{\underset{\underset{\makebox[0pt]{$a_0$}}{\makebox[0pt]{$\big\uparrow$}}}{,}}
a_7,
d^{\left(k\right)},
a_8,
a_9
\bigr)
\]
\end{document}
更多人力投入:
\documentclass[a4paper]{article}
\usepackage{ngerman}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\newcommand{\uunderline}[1]{\underline{\underline{#1}}}
\makeatletter
\newcommand{\zerounderset}[3][\mathord]{%
#1{\vtop{
\let\\\cr
\baselineskip\z@skip\lineskip.25ex
\ialign{\hidewidth$##$\hidewidth\crcr
\omit$#3$\cr
#2\crcr
}%
}}%
}
\makeatother
\begin{document}
\[
s=\bigl(
a_1,
\zerounderset{\big\uparrow}{a_2},
a_3,
\uunderline{a_4},
a_5,
a_6
\zerounderset[\mathpunct]{\big\uparrow\\a_0}{,}
a_7,
d^{\left(k\right)},
a_8,
a_9
\bigr)
\]
\end{document}
答案4
三条建议和一条评论:
加载
ulem
包并使用其\uuline
宏,而不是定义名为的宏\uunderline
。使用
\substack
和\mathclap
宏将箭头和a_0
术语放在逗号下方。如果需要,使用\mathpunct
指令确保相关逗号周围的正常间距。不要自动调整括号的大小;而是使用
\bigl(
和\bigr)
。顺便说一句,该
ngerman
软件包已被弃用;请使用该选项加载 babelngerman
。
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage[normalem]{ulem} % <- new
\begin{document}
\[
s=\bigl(
a_1,
\underset{\big\uparrow}{a_2},
a_3,
\uuline{a_4},
a_5,
a_6
\mathpunct{\underset{\mathclap{\substack{\big\uparrow \\ \textstyle a_0}}}{,}}
a_7,
d^{(k)},
a_8,
a_9
\bigr)
\]
\end{document}