Definir altura fixa (em todas as situações e caracteres) para notações com overset

Definir altura fixa (em todas as situações e caracteres) para notações com overset

Uma desvantagem notável da estética na \vec{}notação é que, para caracteres "curtos" e "altos" ( a, i, vvs b, k, l), a notação vetorial superdefinida mostra diferença em sua altura em relação à linha de base. É possível definir (ou redefinir) caracteres com overset para mostrar uma altura fixa e consistente a partir da linha de base (ou qualquer outro padrão horizontal), independentemente do caractere em que está definido? Abaixo está uma comparação rápida e grosseira do status quo e do objetivo:

Status Quo: as alturas variam

Status Quo: As alturas variam.

Objetivo: As alturas são consistentes

Objetivo: As alturas são consistentes.

OUTRA EDIÇÃO: O vetor personalizado vem deum script escrito pelo usuário Todd Lehman:

\makeatletter
\newlength\xvec@height%
\newlength\xvec@depth%
\newlength\xvec@width%
\newcommand{\xvec}[2][]{%
  \ifmmode%
    \settoheight{\xvec@height}{$#2$}%
    \settodepth{\xvec@depth}{$#2$}%
    \settowidth{\xvec@width}{$#2$}%
  \else%
    \settoheight{\xvec@height}{#2}%
    \settodepth{\xvec@depth}{#2}%
    \settowidth{\xvec@width}{#2}%
  \fi%
  \def\xvec@arg{#1}%
  \def\xvec@dd{:}%
  \def\xvec@d{.}%
  \raisebox{.2ex}{\raisebox{\xvec@height}{\rlap{%
    \kern.05em%  (Because left edge of drawing is at .05em)
    \begin{tikzpicture}[scale=1]
    \pgfsetroundcap
    \draw (.05em,0)--(\[email protected],0);
    \draw (\[email protected],0)--(\[email protected], .075em);
    \draw (\[email protected],0)--(\[email protected],-.075em);
    \ifx\xvec@arg\xvec@d%
      \fill(\xvec@width*.45,.5ex) circle (.5pt);%
    \else\ifx\xvec@arg\xvec@dd%
      \fill(\xvec@width*.30,.5ex) circle (.5pt);%
      \fill(\xvec@width*.65,.5ex) circle (.5pt);%
    \fi\fi%
    \end{tikzpicture}%
  }}}%
  #2%
}
\makeatother

\let\stdvec\vec
\renewcommand{\vec}[1]{\xvec[]{#1}}

% --- Define \dvec and \ddvec for dotted and double-dotted vectors.
\newcommand{\dvec}[1]{\xvec[.]{#1}}
\newcommand{\ddvec}[1]{\xvec[:]{#1}}

Responder1

Aqui está uma solução rápida de baixa tecnologia:

insira a descrição da imagem aqui

\documentclass{article}

\newcommand{\myvec}[1]{\vec{\vphantom{A}#1}}

\begin{document}

$\myvec{a}\cdot\myvec{b}$

\end{document}

Isso será ajustado automaticamente para sub/sobrescritos, mas terá um problema (veja abaixo) se o símbolo do vetor estiver acima de um caractere mais alto que A.

Uma versão um pouco mais complicada \ooalignforçará o vetor a ficar em uma altura como se estivesse acima, Amesmo que esteja colocado sobre algo mais alto.

insira a descrição da imagem aqui

A linha superior é a versão simples acima, onde o terceiro vetor está fora de alinhamento porque A^2é mais alto que A. A segunda linha usa o código

\newcommand{\myvec}[1]{\ooalign{\hfil$\vec{\vphantom{A}}$\hfil\cr\hfil$#1$\hfil\cr}}

mas não se ajustará às alterações de tamanho do subscrito. Se quiser, você pode corrigir isso usando \mathchoice:

\newcommand{\myvec}[1]{\mathchoice
{\ooalign{\hfil$\vec{\vphantom{A}}$\hfil\cr\hfil$#1$\hfil\cr}}
{\ooalign{\hfil$\vec{\vphantom{A}}$\hfil\cr\hfil$#1$\hfil\cr}}
{\ooalign{\hfil$\vec{\vphantom{\scriptstyle A}}$\hfil\cr\hfil$\scriptstyle #1$\hfil\cr}}
{\ooalign{\hfil$\vec{\vphantom{\scriptscriptstyle A}}$\hfil\cr\hfil$\scriptscriptstyle #1$\hfil\cr}}
}

Observe que eu evitaria renovar o \veccomando, pois as setas altas parecem estranhas para mim quando estão acima de letras curtas. Compare \myvec{a}\cdot\myvec{a}com \vec{a}\cdot\vec{a}.

Atualizar:

Como opção final (minha preferida), pode-se definir \myveccom 2 parâmetros: um opcional. O parâmetro obrigatório é a letra impressa com a seta, o segundo parâmetro opcional é um caractere que define a altura da seta.

insira a descrição da imagem aqui

Então, \myvec[t]{a}daria a você um vetor sobre o ana altura do t. A omissão do argumento opcional fornece o mesmo resultado que \vec. A linha acima é produzida a partir do código:

$\myvec{a}\cdot\vec{a}\quad\myvec[t]{a}\cdot\vec{t}\quad\myvec[j]{a}\cdot\vec{j}\quad\myvec[b]{a}\cdot\vec{b}\quad\myvec[A]{a}\cdot\vec{A}$

O código para \myvecé

\newcommand{\myvec}[2][]{\vec{\vphantom{#1}#2}}

e será ajustado para sub/sobrescritos como em $A_{\myvec[t]{a}\cdot\vec{t}}$.

Responder2

A ideia é adicionar um caractere fixo na hora de medir a altura, eu escolhi T. Caso o objeto seja mais alto, a seta se adaptará, como mostra o exemplo (reconhecidamente inventado).

O código da seta foi aprimorado para permitir seu uso também em subscritos e sobrescritos.

\documentclass{article}
\usepackage{tikz}

\makeatletter
\newlength\xvec@height
\newlength\xvec@depth
\newlength\xvec@width
\def\xvec@dd{:}%
\def\xvec@d{.}%
\newcommand{\xvec}[2][]{{\mathpalette\xvec@{{#1}{#2}}}}
\newcommand{\xvec@}[2]{\xvec@@#1#2}
\newcommand{\xvec@@}[3]{%
  \settoheight{\xvec@height}{$\m@th#1 T#3$}%
  \settodepth{\xvec@depth}{$\m@th#1#3$}%
  \settowidth{\xvec@width}{$\m@th#1#3$}%
  \def\xvec@arg{#2}%
  \raisebox{.2ex}{\raisebox{\xvec@height}{\rlap{%
    \kern.05em%  (Because left edge of drawing is at .05em)
    \begin{tikzpicture}[scale=1]
    \pgfsetroundcap
    \draw (.05em,0)--(\[email protected],0);
    \draw (\[email protected],0)--(\[email protected], .075em);
    \draw (\[email protected],0)--(\[email protected],-.075em);
    \ifx\xvec@arg\xvec@d
      \fill(\xvec@width*.45,.5ex) circle (.5pt);
    \else\ifx\xvec@arg\xvec@dd
      \fill(\xvec@width*.30,.5ex) circle (.5pt);
      \fill(\xvec@width*.65,.5ex) circle (.5pt);
    \fi\fi
    \end{tikzpicture}%
  }}}%
  #3%
}
\makeatother

\let\stdvec\vec
\renewcommand{\vec}[1]{\xvec[]{#1}}

% --- Define \dvec and \ddvec for dotted and double-dotted vectors.
\newcommand{\dvec}[1]{\xvec[.]{#1}}
\newcommand{\ddvec}[1]{\xvec[:]{#1}}

\begin{document}

$\vec{a}\cdot\vec{b}$
$\dvec{a}\cdot\dvec{b}$
$\ddvec{a}\cdot\ddvec{b}$
$\dvec{\sum\limits_{k=1}^n a_k}$

$X_{\vec{a}+\vec{b}}$

\end{document}

insira a descrição da imagem aqui

Responder3

Aqui está minha abordagem:

A ideia básicaé salvar a altura de cada vecargumento s e então adicionar uma \rulelargura de 0, mas com a altura do argumento mais alto encontrado dentro de cada \veccom seu argumento real antes de ser realmente impresso. (a expansão ocorre dentro de a \saveboxe, portanto, antes de realmente usar a expressão com todos os seus \vecs, a altura máxima necessária a ser adicionada já foi calculada e adicionada.)

Recursos extras

-- um comando para \vec(named \myVec) que está usando a última altura encontrada (na verdade, o comando que substitui o original \vecdentro do comando básico da minha abordagem -named \mySHVecs-)

-- um par de comandos para salvar e restaurar o valor atual da Altura Máxima armazenada para ser reutilizável (quantas vezes for necessário)

\documentclass{article}
\usepackage{amsmath}

\let\oldvec\vec
\makeatletter
\newsavebox\myVec@TempBox %Box for each vector
\newsavebox\myVec@Box %Box for all vectors
\def\max@Height{0pt}
\newcounter{myVecDepth}



% Comand For SameHeightVectors (mySHVecs):
\newcommand\mySHVecs[1]{%
\xdef\max@Height{0pt}
\def\calcMaxVec##1{%
\savebox\myVec@TempBox{\hbox{\ensuremath{##1}}}\ifdim\dimexpr\ht\myVec@TempBox>\max@Height\xdef\max@Height{\the\ht\myVec@TempBox}\fi}
\let\vec\calcMaxVec\savebox\myVec@Box{\vbox{\ensuremath{#1}}}\let\vec\myVec#1\let\vec\oldvec}




% The changed command of vec that uses the maximum height inside the above environment that can be used outside also to use the last maximum height available
\newcommand\myVec[1]{\oldvec{\rule{0pt}{\max@Height}\ensuremath{#1}}}
% Save and restore current height with optional argument to can be used for several saves/restores
\newcommand\saveVecH[1][\tempheight]{\xdef#1{\max@Height}}
\newcommand\useVecH[1][\tempheight]{\xdef\max@Height{#1}}
\makeatother




%User Command that makes the vectors Same Height
%\newcommand\mySHVecs[1]{\begin{SetVecsToHeight}\ensuremath{#1}\end{SetVecsToHeight}}


\begin{document}

Simple command for some variables:

\vspace{0.5cm}


\[\mySHVecs{\vec{a}\cdot\vec{b}\cdot\vec{F_x^2}}\]

\vspace{1cm}

Demonstration of mixing commands \verb|\mySHVecs|, \verb|\oldvec| and \verb|\myVec|:

\vspace{0.5cm}

$\mySHVecs{\vec{a}\cdot\vec{b}\cdot\vec{F_x^2}}-\dfrac{\oldvec{a}}{b}\cdot \myVec{S}=\myVec{0}$

\vspace{1cm}

Demonstration of saved and reused value of height:

\vspace{0.5cm}

\[
\mySHVecs{\vec{a}\cdot\vec{\dfrac{b}{3}}}\saveVecH+\cdot X_{\mySHVecs{\vec{a}+\oldvec{b}}}\cdot\mySHVecs{\useVecH\vec{F_1}}
\]

\end{document}

Saída:

insira a descrição da imagem aqui

informação relacionada