基于这个答案中,我实现了两个版本的\widetilde
,其宽度足够覆盖我想要的所有文本:
\documentclass{article}
\usepackage{amsmath,amssymb,stackengine,scalerel}
\newlength\A
\ExplSyntaxOn
%first method, based on stackon
\newcommand{\wtildea}[1]{
\settowidth{\A}{#1}
\stackon[-7pt]{$#1$}{\hstretch{\fp_eval:n{\dim_to_fp:n{\A}/21}}{\widetilde{\phantom{#1}}}}
}
%second method, based on tikz
\usepackage{tikz,mathtools}
\newcommand{\wtildeb}[1]{
\settowidth{\A}{$#1$}
\ooalign{$\tikz{\node[xscale=\fp_eval:n{\dim_to_fp:n{\A}}/5.5]{$\widetilde{\phantom{x}}$}}$\cr\hidewidth$#1$\hidewidth\cr}
}
\ExplSyntaxOff
\begin{document}
$$xxAAAAAAAAAAAAxx$$
$$xx\wtildea{AAAAAAAAAAAA}xx$$
$$xx\wtildeb{AAAAAAAAAAAA}xx$$
\end{document}
但是,它们都存在间距问题,并且第一个解决方案会导致带有波浪号的文本向右移动:
我该如何修复它?
答案1
TikZ 解决方案需要inner sep
零,这是文本周围的填充,它不仅会增加 TikZ 图片的宽度,还会进行相同的缩放。
我还\vphantom{#1}
为其添加了一个,以便它获得正确的垂直尺寸。使用baseline
和anchor = base
确保节点也正确垂直放置。
作为一个选项,我添加了一个\resizebox
来自graphics
包的替代方案(由 加载graphicx
,由 加载tikz
)。
这两种解决方案在下标或上标中都不起作用。还需要做一点工作。
代码
\documentclass[varwidth]{standalone}
%\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\newcommand*\wtildea[1]{%
\begingroup
\settowidth{\dimen0}{$#1$}%
\rlap{\resizebox{\dimen0}{\totalheight}{$\widetilde{\phantom{x\vphantom{#1}}}$}}%
\endgroup
#1}
\newcommand*{\wtildeb}[1]{%
\ooalign{%
\tikz[baseline]
\node[anchor=base, inner sep=+0pt, xscale={width("$#1$")/width("$x$")}]
{$\widetilde{\phantom{x\vphantom{#1}}}$};%
\cr\hidewidth$#1$\hidewidth\cr
}%
}
\begin{document}
\[xx AAAAAAAAAAAA xx\]
\[xx\wtildea{AAAAAAAAAAAA}xx\]
\[xx\wtildeb{AAAAAAAAAAAA}xx\]
\end{document}