Uma desvantagem notável da estética na \vec{}
notação é que, para caracteres "curtos" e "altos" ( a
, i
, v
vs 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.
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:
\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 \ooalign
forçará o vetor a ficar em uma altura como se estivesse acima, A
mesmo que esteja colocado sobre algo mais alto.
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 \vec
comando, 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 \myvec
com 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.
Então, \myvec[t]{a}
daria a você um vetor sobre o a
na 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}
Responder3
Aqui está minha abordagem:
A ideia básicaé salvar a altura de cada vec
argumento s e então adicionar uma \rule
largura de 0, mas com a altura do argumento mais alto encontrado dentro de cada \vec
com seu argumento real antes de ser realmente impresso. (a expansão ocorre dentro de a \savebox
e, portanto, antes de realmente usar a expressão com todos os seus \vec
s, 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 \vec
dentro 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: