Establecer una altura fija (en todas las situaciones y caracteres) para notaciones desbordadas

Establecer una altura fija (en todas las situaciones y caracteres) para notaciones desbordadas

Una desventaja notable de la estética en la \vec{}notación es que, para caracteres "cortos" y "altos" ( a, i, vvs b, k, l), la notación vectorial desbordada muestra una diferencia en su altura desde la línea de base. ¿Es posible definir (o redefinir) caracteres desbordados para mostrar una altura fija y consistente desde la línea de base (o cualquier otro estándar horizontal), independientemente del carácter en el que se establezca? A continuación se muestra una comparación rápida y cruda del status quo y el objetivo:

Status Quo: las alturas varían

Status Quo: Las alturas varían.

Objetivo: las alturas son consistentes

Objetivo: Las alturas son consistentes.

OTRA EDICIÓN: El vector personalizado proviene deun guión escrito por el usuario 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}}

Respuesta1

Aquí hay una solución rápida de baja tecnología:

ingrese la descripción de la imagen aquí

\documentclass{article}

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

\begin{document}

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

\end{document}

Esto se ajustará automáticamente para subíndices/superíndices, pero tiene un problema (ver más abajo) si el símbolo del vector está encima de un carácter más alto que A.

Una versión un poco más complicada \ooalignobligará al vector a estar a una altura como si estuviera arriba, Aincluso si se coloca sobre algo más alto.

ingrese la descripción de la imagen aquí

La línea superior es la versión simple anterior, donde el tercer vector está desalineado ya que A^2es más alto que A. La segunda línea usa el código.

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

pero no se ajustará a los cambios de tamaño de subíndice. Si lo deseas, puedes solucionarlo 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}}
}

Tenga en cuenta que evitaría renovar el \veccomando ya que las flechas altas me parecen extrañas cuando están encima de letras cortas. Comparar \myvec{a}\cdot\myvec{a}con \vec{a}\cdot\vec{a}.

Actualizar:

Como última opción (mi favorita), se podría definir \myveccon 2 parámetros: uno opcional. El parámetro requerido es la letra impresa con la flecha, el segundo parámetro opcional es un carácter que establece la altura de la flecha.

ingrese la descripción de la imagen aquí

Entonces \myvec[t]{a}le daría un vector sobre el aa la altura del t. Omitir el argumento opcional le da el mismo resultado que \vec. La línea anterior se produce a partir del 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}$

El código para \myveces

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

y se ajustará a los subíndices/superíndices como en $A_{\myvec[t]{a}\cdot\vec{t}}$.

Respuesta2

La idea es agregar un carácter fijo al medir la altura, yo elegí T. En caso de que el objeto sea más alto, la flecha se adaptará, como muestra el ejemplo (ciertamente artificial).

El código de la flecha se ha mejorado para permitir su uso también en subíndices y superíndices.

\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}

ingrese la descripción de la imagen aquí

Respuesta3

Aquí está mi enfoque:

la idea basicaes guardar la altura de cada vecargumento s y luego agregar un \ruleancho de 0 pero con la altura del argumento más alto que se encuentra dentro de cada uno \veccon su argumento real antes de imprimirlo realmente. (la expansión se lleva a cabo dentro de a \saveboxy, por lo tanto, antes de usar realmente la expresión con todas sus \vecs, la altura máxima necesaria para agregar ya está calculada y agregada).

Características adicionales

-- un comando para \vec(named \myVec) que utiliza la última altura encontrada (en realidad, el comando que reemplaza el original \vecdentro del comando básico de mi enfoque -named \mySHVecs-)

-- un par de comandos para guardar y restaurar el valor actual de Altura Máxima almacenado para poder reutilizarlo (tantas veces como sea necesario)

\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}

Producción:

ingrese la descripción de la imagen aquí

información relacionada