Ein deutlicher ästhetischer Nachteil der \vec{}
Notation ist, dass die überlagerte Vektornotation bei „kurzen“ und „langen“ Zeichen ( a
, i
, v
vs b
, k
, l
) einen Höhenunterschied zur Grundlinie aufweist. Ist es möglich, überlagerte Zeichen so zu definieren (oder neu zu definieren), dass sie eine feste, konsistente Höhe zur Grundlinie (oder einem anderen horizontalen Standard) aufweisen, unabhängig davon, auf welches Zeichen sie gesetzt werden? Nachfolgend finden Sie einen schnellen, groben Vergleich des Status Quo und des Ziels:
Status Quo: Höhen variieren.
Ziel: Die Höhen sind konsistent.
NOCH EIN EDIT: Der angepasste Vektor stammt vonein Skript, geschrieben vom Benutzer 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}}
Antwort1
Hier ist eine schnelle Low-Tech-Lösung:
\documentclass{article}
\newcommand{\myvec}[1]{\vec{\vphantom{A}#1}}
\begin{document}
$\myvec{a}\cdot\myvec{b}$
\end{document}
Dies wird automatisch für Tief-/Hochstellungen angepasst, es gibt jedoch ein Problem (siehe unten), wenn sich das Vektorsymbol über einem Zeichen befindet, das größer ist als A
.
Bei einer etwas komplizierteren Version \ooalign
wird der Vektor auf eine Höhe gezwungen, als ob er darüber wäre, A
auch wenn er über einem höheren Objekt platziert ist.
Die oberste Zeile ist die einfache Version oben, wobei der dritte Vektor nicht ausgerichtet ist, da A^2
größer ist als A
. Die zweite Zeile verwendet den Code
\newcommand{\myvec}[1]{\ooalign{\hfil$\vec{\vphantom{A}}$\hfil\cr\hfil$#1$\hfil\cr}}
passt sich aber nicht an Änderungen der Indexgröße an. Wenn Sie möchten, können Sie das folgendermaßen beheben \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}}
}
Beachten Sie, dass ich die Erneuerung des Befehls vermeiden würde, \vec
da die hohen Pfeile über kurzen Buchstaben für mich seltsam aussehen. Vergleichen Sie \myvec{a}\cdot\myvec{a}
mit \vec{a}\cdot\vec{a}
.
Aktualisieren:
Als letzte Option (mein Favorit) könnte man \myvec
2 Parameter definieren: einer davon ist optional. Der erforderliche Parameter ist der gedruckte Buchstabe mit dem Pfeil, der zweite, optionale Parameter ist ein Zeichen, das die Höhe des Pfeils festlegt.
\myvec[t]{a}
Sie erhalten also einen Vektor über a
auf der Höhe von t
. Wenn Sie das optionale Argument weglassen, erhalten Sie dasselbe Ergebnis wie \vec
. Die obige Zeile wird aus dem Code erzeugt:
$\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}$
Der Code für \myvec
ist
\newcommand{\myvec}[2][]{\vec{\vphantom{#1}#2}}
und es wird für tiefgestellte/hochgestellte Zeichen wie in angepasst $A_{\myvec[t]{a}\cdot\vec{t}}$
.
Antwort2
Die Idee ist, beim Messen der Höhe ein festes Zeichen hinzuzufügen. Ich habe gewählt T
. Falls das Objekt höher ist, passt sich der Pfeil an, wie das (zugegebenermaßen konstruierte) Beispiel zeigt.
Der Code für den Pfeil wurde erweitert, um seine Verwendung auch in tiefgestellten und hochgestellten Zeichen zu ermöglichen.
\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}
Antwort3
Hier ist mein Ansatz:
Die Grundideebesteht darin, die Höhe jedes vec
s-Arguments zu speichern und dann ein \rule
mit der Breite 0 hinzuzufügen, aber mit der Höhe des höheren Arguments, das sich in jedem befindet, \vec
mit seinem echten Argument, bevor es wirklich gedruckt wird. (Die Erweiterung findet innerhalb von a statt \savebox
und daher \vec
ist die maximal hinzuzufügende Höhe bereits berechnet und hinzugefügt worden, bevor der Ausdruck mit all seinen s wirklich verwendet wird.)
Zusatzfunktionen
– ein Befehl für \vec
(benannt \myVec
), der die zuletzt gefundene Höhe verwendet (tatsächlich der Befehl, der das Original \vec
innerhalb des Basisbefehls meines Ansatzes \mySHVecs
– benannt – ersetzt)
- ein Befehlspaar zum Speichern und Wiederherstellen des aktuellen Werts der gespeicherten Maximalhöhe, um eine Wiederverwendung zu ermöglichen (so oft wie nötig)
\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}
Ausgabe: