宽条和上标

宽条和上标

这是使用时出现的问题Hendrik Vogt 的 \widebar。我注意到上标字母widebar会使上标升高。有什么方法可以让上标保持原来的高度吗?(这样做语法不好吗?)

\widebar{\mathbb R}^2 \quad \mathbb R^2 
\quad 
\widebar R^2 \quad R^2

上标 R

\documentclass[preview]{standalone}
\usepackage{amsmath,amssymb}

%%%%%%%%%%%%%%%%%%%%%%
%% Hendrik's answer %%
%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\let\save@mathaccent\mathaccent
\newcommand*\if@single[3]{%
    \setbox0\hbox{${\mathaccent"0362{#1}}^H$}%
    \setbox2\hbox{${\mathaccent"0362{\kern0pt#1}}^H$}%
    \ifdim\ht0=\ht2 #3\else #2\fi
}
%The bar will be moved to the right by a half of \macc@kerna, which is computed by amsmath:
\newcommand*\rel@kern[1]{\kern#1\dimexpr\macc@kerna}
%If there's a superscript following the bar, then no negative kern may follow the bar;
%an additional {} makes sure that the superscript is high enough in this case:
\newcommand*\widebar[1]{\@ifnextchar^{{\wide@bar{#1}{0}}}{\wide@bar{#1}{1}}}
%Use a separate algorithm for single symbols:
\newcommand*\wide@bar[2]{\if@single{#1}{\wide@bar@{#1}{#2}{1}}{\wide@bar@{#1}{#2}{2}}}
\newcommand*\wide@bar@[3]{%
    \begingroup
    \def\mathaccent##1##2{%
        %Enable nesting of accents:
        \let\mathaccent\save@mathaccent
        %If there's more than a single symbol, use the first character instead (see below):
        \if#32 \let\macc@nucleus\first@char \fi
        %Determine the italic correction:
        \setbox\z@\hbox{$\macc@style{\macc@nucleus}_{}$}%
        \setbox\tw@\hbox{$\macc@style{\macc@nucleus}{}_{}$}%
        \dimen@\wd\tw@
        \advance\dimen@-\wd\z@
        %Now \dimen@ is the italic correction of the symbol.
        \divide\dimen@ 3
        \@tempdima\wd\tw@
        \advance\@tempdima-\scriptspace
        %Now \@tempdima is the width of the symbol.
        \divide\@tempdima 10
        \advance\dimen@-\@tempdima
        %Now \dimen@ = (italic correction / 3) - (Breite / 10)
        \ifdim\dimen@>\z@ \dimen@0pt\fi
        %The bar will be shortened in the case \dimen@<0 !
        \rel@kern{0.6}\kern-\dimen@
        \if#31
        \overline{\rel@kern{-0.6}\kern\dimen@\macc@nucleus\rel@kern{0.4}\kern\dimen@}%
        \advance\[email protected]\dimexpr\macc@kerna
        %Place the combined final kern (-\dimen@) if it is >0 or if a superscript follows:
        \let\final@kern#2%
        \ifdim\dimen@<\z@ \let\final@kern1\fi
        \if\final@kern1 \kern-\dimen@\fi
        \else
        \overline{\rel@kern{-0.6}\kern\dimen@#1}%
        \fi
    }%
    \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
    %The following initialises \macc@kerna and calls \mathaccent:
    \if#31
    \macc@nested@a\relax111{#1}%
    \else
    %If the argument consists of more than one symbol, and if the first token is
    %a letter, use that letter for the computations:
    \def\gobble@till@marker##1\endmarker{}%
    \futurelet\first@char\gobble@till@marker#1\endmarker
    \ifcat\noexpand\first@char A\else
    \def\first@char{}%
    \fi
    \macc@nested@a\relax111{\first@char}%
    \fi
    \endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%
%% End Hendrik %%
%%%%%%%%%%%%%%%%%

\begin{document}
$
\widebar{\mathbb R}^2 \quad \mathbb R^2 
\quad 
\widebar R^2 \quad R^2
$
\end{document}

答案1

您可以使用\smash[t]{...},或者在指数前添加一对括号来实现:

\documentclass[preview, border = 5pt]{standalone}
\usepackage{amsmath,amssymb}

%%%%%%%%%%%%%%%%%%%%%%
%% Hendrik's answer %%
%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\let\save@mathaccent\mathaccent
\newcommand*\if@single[3]{%
    \setbox0\hbox{${\mathaccent"0362{#1}}^H$}%
    \setbox2\hbox{${\mathaccent"0362{\kern0pt#1}}^H$}%
    \ifdim\ht0=\ht2 #3\else #2\fi
}
%The bar will be moved to the right by a half of \macc@kerna, which is computed by amsmath:
\newcommand*\rel@kern[1]{\kern#1\dimexpr\macc@kerna}
%If there's a superscript following the bar, then no negative kern may follow the bar;
%an additional {} makes sure that the superscript is high enough in this case:
\newcommand*\widebar[1]{\@ifnextchar^{{\wide@bar{#1}{0}}}{\wide@bar{#1}{1}}}
%Use a separate algorithm for single symbols:
\newcommand*\wide@bar[2]{\if@single{#1}{\wide@bar@{#1}{#2}{1}}{\wide@bar@{#1}{#2}{2}}}
\newcommand*\wide@bar@[3]{%
    \begingroup
    \def\mathaccent##1##2{%
        %Enable nesting of accents:
        \let\mathaccent\save@mathaccent
        %If there's more than a single symbol, use the first character instead (see below):
        \if#32 \let\macc@nucleus\first@char \fi
        %Determine the italic correction:
        \setbox\z@\hbox{$\macc@style{\macc@nucleus}_{}$}%
        \setbox\tw@\hbox{$\macc@style{\macc@nucleus}{}_{}$}%
        \dimen@\wd\tw@
        \advance\dimen@-\wd\z@
        %Now \dimen@ is the italic correction of the symbol.
        \divide\dimen@ 3
        \@tempdima\wd\tw@
        \advance\@tempdima-\scriptspace
        %Now \@tempdima is the width of the symbol.
        \divide\@tempdima 10
        \advance\dimen@-\@tempdima
        %Now \dimen@ = (italic correction / 3) - (Breite / 10)
        \ifdim\dimen@>\z@ \dimen@0pt\fi
        %The bar will be shortened in the case \dimen@<0 !
        \rel@kern{0.6}\kern-\dimen@
        \if#31
        \overline{\rel@kern{-0.6}\kern\dimen@\macc@nucleus\rel@kern{0.4}\kern\dimen@}%
        \advance\[email protected]\dimexpr\macc@kerna
        %Place the combined final kern (-\dimen@) if it is >0 or if a superscript follows:
        \let\final@kern#2%
        \ifdim\dimen@<\z@ \let\final@kern1\fi
        \if\final@kern1 \kern-\dimen@\fi
        \else
        \overline{\rel@kern{-0.6}\kern\dimen@#1}%
        \fi
    }%
    \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
    %The following initialises \macc@kerna and calls \mathaccent:
    \if#31
    \macc@nested@a\relax111{#1}%
    \else
    %If the argument consists of more than one symbol, and if the first token is
    %a letter, use that letter for the computations:
    \def\gobble@till@marker##1\endmarker{}%
    \futurelet\first@char\gobble@till@marker#1\endmarker
    \ifcat\noexpand\first@char A\else
    \def\first@char{}%
    \fi
    \macc@nested@a\relax111{\first@char}%
    \fi
    \endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%
%% End Hendrik %%
%%%%%%%%%%%%%%%%%

\begin{document}

$ \smash[t]{\widebar{\mathbb R}}^2\quad\widebar{\mathbb R}{}^2\quad
\widebar{R}{}^2 \quad \mathbb R^2\quad R^2 $

\end{document} 

在此处输入图片描述

答案2

问题是,上标的设置取决于前一个标记的高度。您可以使用 告诉 LaTeX 标记的高度为 0pt,\smash或者使用\vphantom让上标之前的标记具有内容的高度,而无需\widebar

\documentclass[preview,border=4mm]{standalone}
\usepackage{amsmath,amssymb}

%%%%%%%%%%%%%%%%%%%%%%
%% Hendrik's answer %%
%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\let\save@mathaccent\mathaccent
\newcommand*\if@single[3]{%
    \setbox0\hbox{${\mathaccent"0362{#1}}^H$}%
    \setbox2\hbox{${\mathaccent"0362{\kern0pt#1}}^H$}%
    \ifdim\ht0=\ht2 #3\else #2\fi
}
%The bar will be moved to the right by a half of \macc@kerna, which is computed by amsmath:
\newcommand*\rel@kern[1]{\kern#1\dimexpr\macc@kerna}
%If there's a superscript following the bar, then no negative kern may follow the bar;
%an additional {} makes sure that the superscript is high enough in this case:
\newcommand*\widebar[1]{\@ifnextchar^{{\wide@bar{#1}{0}}}{\wide@bar{#1}{1}}}
%Use a separate algorithm for single symbols:
\newcommand*\wide@bar[2]{\if@single{#1}{\wide@bar@{#1}{#2}{1}}{\wide@bar@{#1}{#2}{2}}}
\newcommand*\wide@bar@[3]{%
    \begingroup
    \def\mathaccent##1##2{%
        %Enable nesting of accents:
        \let\mathaccent\save@mathaccent
        %If there's more than a single symbol, use the first character instead (see below):
        \if#32 \let\macc@nucleus\first@char \fi
        %Determine the italic correction:
        \setbox\z@\hbox{$\macc@style{\macc@nucleus}_{}$}%
        \setbox\tw@\hbox{$\macc@style{\macc@nucleus}{}_{}$}%
        \dimen@\wd\tw@
        \advance\dimen@-\wd\z@
        %Now \dimen@ is the italic correction of the symbol.
        \divide\dimen@ 3
        \@tempdima\wd\tw@
        \advance\@tempdima-\scriptspace
        %Now \@tempdima is the width of the symbol.
        \divide\@tempdima 10
        \advance\dimen@-\@tempdima
        %Now \dimen@ = (italic correction / 3) - (Breite / 10)
        \ifdim\dimen@>\z@ \dimen@0pt\fi
        %The bar will be shortened in the case \dimen@<0 !
        \rel@kern{0.6}\kern-\dimen@
        \if#31
        \overline{\rel@kern{-0.6}\kern\dimen@\macc@nucleus\rel@kern{0.4}\kern\dimen@}%
        \advance\[email protected]\dimexpr\macc@kerna
        %Place the combined final kern (-\dimen@) if it is >0 or if a superscript follows:
        \let\final@kern#2%
        \ifdim\dimen@<\z@ \let\final@kern1\fi
        \if\final@kern1 \kern-\dimen@\fi
        \else
        \overline{\rel@kern{-0.6}\kern\dimen@#1}%
        \fi
    }%
    \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
    %The following initialises \macc@kerna and calls \mathaccent:
    \if#31
    \macc@nested@a\relax111{#1}%
    \else
    %If the argument consists of more than one symbol, and if the first token is
    %a letter, use that letter for the computations:
    \def\gobble@till@marker##1\endmarker{}%
    \futurelet\first@char\gobble@till@marker#1\endmarker
    \ifcat\noexpand\first@char A\else
    \def\first@char{}%
    \fi
    \macc@nested@a\relax111{\first@char}%
    \fi
    \endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%
%% End Hendrik %%
%%%%%%%%%%%%%%%%%

\newcommand*{\widebarpot}[2]{%
  \smash{\widebar{#1}}^#2}% or \widebar{#1}\vphantom{#1}^#2

\begin{document}
$
\widebar{\mathbb R}^2 \quad \mathbb R^2 
\quad 
\widebar R^2 \quad R^2
$\\
$
\widebarpot{\mathbb R}{2} \quad \mathbb R^2 
\quad 
\widebarpot{R}{2} \quad R^2
$
\end{document}

使用\smash在此处输入图片描述

使用\vphantom在此处输入图片描述

答案3

账户(对于重音)原子,就其高度而言,将被认为等于其底部。宽条的“手工”构造并不构成账户原子,因此整个盒子用于确定高度。

如果你不缺数学家,我建议使用\widebarmathabxhttps://tex.stackexchange.com/a/364929/4427用于源和另一个应用程序)。

\documentclass{article}
\usepackage{amsmath,amssymb}

\DeclareFontFamily{U}{mathx}{\hyphenchar\font45}
\DeclareFontShape{U}{mathx}{m}{n}{ <-> mathx10 }{}
\DeclareSymbolFont{mathx}{U}{mathx}{m}{n}
\DeclareFontSubstitution{U}{mathx}{m}{n}
\DeclareMathAccent{\widebar}{\mathalpha}{mathx}{"73}

\begin{document}

$
\bar{\mathbb{R}}^2
\quad
\mathbb{R}^2
\quad
\bar{R}^2
\quad
 R^2
$

$
\widebar{\mathbb{R}}^2
\quad
\mathbb{R}^2
\quad
\widebar{R}^2
\quad
 R^2
$

\end{document}

在此处输入图片描述

相关内容