% \iffalse meta-comment % % mattens.dtx % Copyright (C) 2001--2009 Danie Els % % ------------------------------------------------------------------- % The mattens package % for vector/tensor typesetting % ------------------------------------------------------------------- % This work may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.3c of this % license or (at your option) any later version. The latest version % of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status 'maintained'. % % This Current Maintainer of this work is Danie Els (dnjels@sun.ac.za) % % This package consists of the files: mattens.dtx % mattens.ins % and the derived files: mattens.sty % ------------------------------------------------------------------- % % \fi % % \iffalse %<*driver> \documentclass[a4paper]{ltxdoc} \makeatletter \newcommand{\DeclareSBox}[2]{% \@ifdefinable{#1}{% \edef\tempa{\expandafter\@gobble\string#1}% \edef\tempa{\csname MTbox@\tempa\endcsname}% \expandafter\newbox\tempa \global\sbox{\tempa}{#2}% \protected@xdef#1{\noexpand\usebox{\tempa}}}} \usepackage{amsmath} \usepackage{amsfonts} \DeclareMathSymbol{\square}{\mathord}{AMSa}{"03} \newcommand*{\m}{\raisebox{.1ex}{$\scriptscriptstyle\square$}} \DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl} \usepackage{color} % Declare the following saved box before % the accents and bm packages are loaded \DeclareSBox{\AccentBox}{$\dot{\overline{f}}^a_b$} \usepackage{array} \usepackage{accents} \newcommand{\dotr}[1]{\accentset{\phantom{r}{\displaystyle.}r}{#1}} \usepackage{mattens} \usepackage{bm} \bmdefine{\bO}{\mathit{\Omega}} \newcommand*{\pkg}[1]{\textsf{#1}} \newcommand*{\opt}[1]{\textsf{#1}} \newcommand*{\MT}{\pkg{mattens}} \newcommand*{\Hass}{Hassenpflug} \newcommand*{\myemph}[1]{\emph{#1}} \newenvironment{Decl}% {\par\small\addvspace{2.3ex plus 1ex}% \vskip -\parskip \noindent\hspace{\leftmargini}% \begin{tabular}{|l|}\hline\ignorespaces}% {\\\hline\end{tabular}\nobreak\par\nobreak \vspace{2.3ex}\vskip -\parskip} \newenvironment{Indent}[1]{% \begin{list}{}{% \setlength{\topsep}{0pt}% \setlength{\leftmargin}{#1}% \setlength{\listparindent}{\parindent}% \setlength{\itemindent}{\parindent}% \setlength{\parsep}{\parskip}}% \item[] }{\end{list}} \newenvironment{sample}{% \begin{quote}\small\begin{tabbing}% \hskip12pc\=\kill}% {\end{tabbing}\end{quote}} \newcommand*{\sphline}{% horizontal table line with spaces \noalign{\vskip3pt}\hline\noalign{\vskip3pt}} \newcommand*{\tdot}{\ensuremath{\cdot}} \newcommand*{\trnsp}{\ensuremath{\mathsf{T}}} \newcommand*{\norm}[1]{\ensuremath{\lVert{#1}\rVert}} \newcommand*{\SB}[1]{\ensuremath{\left[\, #1\right]}} \MakeShortVerb{\|} \EnableCrossrefs %\DisableCrossrefs % Say \DisableCrossrefs if index is ready \CodelineIndex \RecordChanges % Gather update information %\OnlyDescription % comment out for implementation details \setlength\hfuzz{15pt} % dont make so many \hbadness=7000 % over and under full box warnings \makeatother \begin{document} \DocInput{mattens.dtx} \end{document} % % % \fi % % \CheckSum{584} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% % % \DoNotIndex{\,, \@empty, \@gobble, \@ifnextchar, \@ifstar, % \@ifundefined, \@firstofone} % \DoNotIndex{\addtolength} % \DoNotIndex{\begingroup, \boldsymbol, \box} % \DoNotIndex{\copy, \csname, \CurrentOption} % \DoNotIndex{\DeclareOption, \DeclareRobustCommand, \def, \dp} % \DoNotIndex{\edef, \else, \endcsname, \endgroup, \ensuremath, % \expandafter} % \DoNotIndex{\fi} % \DoNotIndex{\global} % \DoNotIndex{\hskip, \ht} % \DoNotIndex{\ifdim, \ifx} % \DoNotIndex{\leavevmode, \left, \let, \lVert} % \DoNotIndex{\m@th, \mathpalette, \mathsf, \mathstrut, \mskip} % \DoNotIndex{\NeedsTeXFormat, \newbox, \newcommand, \newif, \newlength, % \newmuskip, \newsavebox, \null} % \DoNotIndex{\overline} % \DoNotIndex{\PackageError, \PackageWarning, \ProcessOptions, \protect, % \protected@xdef, \providecommand, \ProvidesPackage} % \DoNotIndex{\relax, \renewcommand, \RequirePackage, \right, \rlap, % \rVert} % \DoNotIndex{\sbox, \setbox, \setlength, \space, \string} % \DoNotIndex{\the} % \DoNotIndex{\underline, \usebox, \wd, \widetilde} % \DoNotIndex{\z@} % % \changes{1.0}{2001 Dec 9}{Initial version} % \changes{1.1}{2004 Jan 15}{Doc: Updated} % \changes{1.3}{2009 Sep 1}{Doc: Updated} % % % \GetFileInfo{mattens.sty} % % % \title{The \MT\ package\thanks{This file has version number % \fileversion, last revised % \filedate.}} % \author{Danie Els} % \date{\filedate} % \maketitle % % \begin{abstract} % \noindent The \MT\ package contains the definitions to typeset vectors and % tensors such as $\aS{e}_i$, $\bS[\dot]{x}^r$, $\bSb{E}^s_r$, etc., for the % representation of common vectors and tensors such as forces, velocities, % moments of inertia, etc. These symbols (and variants thereof) are found on % the black boards of engineering schools and in many journals and books, % particularly those concerned with dynamics and kinematics. % % This package adheres to the well defined and documented notation of % Hassenpflug.\footnote{^^A % Hassenpflug, W.C., % Matrix Tensor Notation Part I. Rectilinear Orthogonal Coordinates. % \emph{Comput. Math.\ Applic.,} vol.\ 26, no.\ 3, 1993, pp.\ 55--93.}^^A % \textsuperscript{,}^^A % \footnote{ % Hassenpflug, W.C., % Matrix Tensor Notation Part II. Skew and Curved Coordinates. % \emph{Comput. Math. Appl.}, vol.\ 29, no.\ 11, 1993, pp. 1--103.} % % \medskip % \noindent\slshape{\bfseries Keywords:} vector, matrix, tensor, notation. % \end{abstract} % % \clearpage % {\parskip0pt\tableofcontents} % % \clearpage % \section{Background} % % A browse through journals and handbooks, in particular those concerned with % dynamics, reveals an amazing array of private notations for vectors and % tensors. Every author has his or her own notation, making it very difficult % to comprehend what is going on in complex multi reference axes environments. % % This package is based on the notation of \Hass\cite{Hass93a,Hass93b}. It was % developed and refined by Dr.~\Hass{} over many years of teaching engineering, % and as stated by him\cite{Hass93a}: % % \begin{quote}\slshape % ``It is designed particulary to distinguish between vectors and tensors % and their representation as vectors and matrices in different coordinate % systems. The main purpose of this notation is that it can be used in the % teaching situation, therefore, it conveys all the information explicitly % in the symbols, and it can be used in handwriting.'' % \end{quote} % % \noindent \Hass\cite{Hass93a} identifies the following list of requirements % for a good notation for tensor quantities and operations, to which his % notation conforms. A notation must: % \begin{itemize} % \item be easily written by hand; % \item distinguish between vector and scalar quantities; % \item distinguish between (second order) tensors and vectors; % \item distinguish between physical vectors and their representation % by vector arrays, and between physical (second order) tensors and % their representation by matrices; % \item distinguish between row and column vectors; % \item use the same symbol as name for the same vector or tensor in % either its physical sense or its representation by a vector array % or matrix in different coordinate axes; % \item distinguish between matrix/vector representation of the same % vector/tensor in different coordinate axes; % \item be equally valid in orthonormal and skew coordinate axes; % \item indicate all intended operations uniquely; % \item be equally valid in all dimensions; % \item be equally valid for algebraic vector/matrix algebra which has % no connection to any metric space; % \item be applicable to differentials; % \item allow for defaults to avoid repetitive elaborate symbols, i.e., % not all the symbols need to be written down explicitly if it is % clear from the context. % \item It must be well documented (own addition). % \end{itemize} % % \noindent The \MT\ package was developed to typeset the \Hass{} matrix % tensor symbols in a consistent manner. % % An appeal is made to the engineering and scientific community to adopt this % notation, because of its consistency and ease of use. % % \section{Usage of \MT\ package} % % The \MT\ package is loaded in the document preamble with: % \begin{quote} % \begin{tabbing} % \hskip14pc\=\kill % \qquad$\vdots$\\ % \cmd{\usepackage}\oarg{options}|{mattens}| \>|% amsmath loaded internally|\\ % \qquad$\vdots$\\ % \cmd{\usepackage}\marg{font packages} \>|%|\\ % \cmd{\DeclareSymbolFont}... \>|% All the font changes|\\ % \cmd{\SetSymbolFont}... \>|%|\\ % \cmd{\DeclareSymbolFontAlphabet}... \>|%|\\ % \qquad$\vdots$\\ % \cmd{\usepackage}|{bm} %\boldsymbol redirected to call \bm|\\ % \qquad$\vdots$ % \end{tabbing} % \end{quote} % % \noindent When \MT\ is loaded, the \pkg{amsmath} package is loaded % automatically, because it is needed for the redefined \cmd{\overrightarrow} % and \cmd{\underrightarrow} commands, as well as the \cmd{\boldsymbol} % command. It must be loaded before any font packages that redefine some of the % \pkg{amsmath} symbols or commands. % % On the other hand, the preferred method for obtaining bold italic math % symbols is the \cmd{\bm} command of the \pkg{bm} package.\footnote{In the % \pkg{amsmath} documentation, \AmS{} recommends the \cmd{\bm} command of the % \pkg{bm} package instead of the \cmd{\boldsymbol} command for bold italic % math symbols. The \cmd{\boldsymbol} puts its contents in a box, % \cmd{\mbox\{}\cmd{\boldmath\$}\meta{contents}\texttt{\$\}}, while \cmd{\bm} % is a font changing command that uses the appropriate bold math font.} The % \pkg{bm} package must be loaded after all the font packages in order for it % to recognize the bold math versions. The \pkg{bm} package reroutes the % \cmd{\boldsymbol} command to point to \cmd{\bm}. If \cmd{\boldsymbol} is % called after the \pkg{bm} package is loaded, it is equivalent to \cmd{\bm}. % If the \pkg{bm} package is not loaded, \MT\ defaults to the \cmd{\boldsymbol} % command. % % The \MT\ package by default sets bold italics symbols. This choice stems from % the ISO standards for typesetting of vectors and tensors. The formatting of % symbols then indicates the fact that it is a vector/tensor and the lines, % arrows and sub- and superscripts indicate the specific type and reference % axes. % % The following options are recognized by \MT: % % \begin{description} % \item[\normalfont\opt{noformat}:] No symbol formatting is performed, % otherwise symbols are set by default in bold italics with the % \cmd{\boldsymbol} or \cmd{\bm} command. % % It is important to note that the \Hass{} requirement of easily % written by hand is not fulfilled if the symbols are formatted % by anything else than normal math fonts. % % \item[\normalfont\opt{mathstrut}:] A mathstrut is inserted with the % symbol to force all the lines and arrows to the same height and % depth. The default is no mathstrut. % \end{description} % % \clearpage % \section{List of \MT\ commands} % % \begin{table}[htbp] % \caption{List of Matrix Tensor typing commands} \label{tab:1} % \small % \renewcommand{\footnoterule}{} % \begin{tabular}{@{}ll>{\itshape}r@{}>{\itshape}c@{}>{\itshape}lc@{}} % \sphline % \bfseries Type & % \bfseries Command & % \multicolumn{3}{c}{\bfseries Description} & % \bfseries Output % \\ % \sphline % % Physical column vector& % \cmd{\aS}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{aS} & % arrow--&Symbol& & % $\aS{x}$ % \\[1.0ex] % % Physical row vector & % \cmd{\Sa}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{Sa} & % &Symbol&--arrow& % $\Sa{x}$ % \\[1.0ex] % % Column vector & % \cmd{\bS}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{bS} & % bar--&Symbol& & % $\bS{x}$ % \\[1.0ex] % % Row vector & % \cmd{\Sb}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{Sb} & % &Symbol&--bar & % $\Sb{x}$ % \\[1.0ex] % % Physical tensor & % \cmd{\aSa}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{aSa}& % arrow--&Symbol&--arrow& % $\aSa{E}$ % \\[1.0ex] % % Tensor (mixed base) & % \cmd{\aSb}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{aSb}& % arrow--&Symbol&--bar & % $\aSb{E}$ % \\[1.0ex] % % Tensor (mixed base) & % \cmd{\bSa}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{bSa}& % bar--&Symbol&--arrow& % $\bSa{E}$ % \\[1.0ex] % % Tensor & % \cmd{\bSb}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{bSb}& % bar--&Symbol&--bar & % $\bSb{E}$ % \\[1.0ex] % % Cross-product tensor$^\dag$ & % \cmd{\aCSa}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{aCSa}& % arrow--C&Symbol&--arrow& % $\aCSa{w}$ % \\[1.0ex] % % Cross-product tensor & % \cmd{\bCSb}\oarg{accent}\marg{Symbol}\SpecialUsageIndex{bCSb}& % bar--C&Symbol&--bar & % $\bCSb{w}$ % \\[1.0ex] % % \sphline % \multicolumn{5}{@{}l}{\footnotesize$^\dag$~ % It is defined as the tensor $\bCSb{a}$ associated with the % vector $\bS{a}$, where $\bS{a}\times\bS{c}=\bCSb{a}\cdot\bS{c}$} % \end{tabular} % \end{table} % % \subsection{General syntax} % % The general syntax of the \MT\ commands is % \begin{Decl} % |\|\m|S|\m\,| |\oarg{accent}\marg{Symbol} ~~ % |\|\m|CS|\m\,| |\oarg{accent}\marg{Symbol}\\[1ex] % |\|\m|S|\m\,|*|\oarg{accent}\marg{Symbol}~~~ % |\|\m|CS|\m\,|*|\oarg{accent}\marg{Symbol} % \end{Decl} % \noindent with command names $\cmd{\bS}$, $\cmd{\aS}$, $\cmd{\aSa}$, % $\cmd{\aSb}$, etc. See table\:\ref{tab:1} for a full list of all the % commands. The ``starred'' form is used to set the symbol in normal math. % This can be used for compound tensors or for pre-declared symbols (see % \pkg{bm} documentation). An example of the usage is % \begin{sample} % \hskip4pc\=\hskip8pc\=\hskip2pc\=\kill^^A % \cmd{\aS}|{e}| \> \cmd{\aS*}|{e}| \> $\aS{e}$ \> $\aS*{e}$\\[0.75ex] % \cmd{\Sb}|{x}| \> \cmd{\Sb*}|{x}| \> $\Sb{x}$ \> $\Sb*{x}$\\[0.75ex] % \cmd{\aCSa}|{z}|\> \cmd{\aCSa*}|{z}| \> $\aCSa{z}$\> $\aCSa*{z}$ % \end{sample} % The optional argument \meta{accent} is intended for \LaTeX{} accent commands % such as $\cmd{\dot}$, $\cmd{\ddot}$, etc., or their $\AmS$ equivalents, % $\cmd{\Dot}$, $\cmd{\Ddot}$. % \begin{sample} % |\bS[\Ddot]{x}| \> $\bS[\Ddot]{x}$ % \end{sample} % % The \MT\ commands look ahead for sub- and superscripts (including primes) in % order to place them at the correct horizontal and vertical positions. % \begin{sample} % \cmd{\bS}|[|\cmd{\Dot}|]{x}^s_i| \> $\bS[\Dot]{x}^s_i$ \\[1ex] % \cmd{\bS}|[|\cmd{\Ddot}|]{x}_i^s| \> $\bS[\Ddot]{x}_i^s$ \\[1ex] % \cmd{\bS}|{x}''^s_i| \> $\bS{x}''^s_i$ \\[1ex] % \cmd{\bSa}|{E}^k| \> $\bSa{E}^k$ \\[1ex] % \cmd{\aSb}|[|\cmd{\Dot}|]{E}_s| \> $\aSb[\Dot]{E}_s$ % \end{sample} % % The commands are also robust and can be used in moving commands such as % footnotes\footnote{A vector $\aS{e}_i$ in a footnote}, headers, etc. % \begin{sample} % |\footnote{A vector $\aS{e}_i$ in a footnote}| % \end{sample} % % The symbols scale to the appropriate sizes if used in sub- and superscripts. % For example, for an integration path parameterized by the vector % $\bS{r}^s(\xi)$, the equation for a line integral % \begin{verbatim} % \begin{equation*} % \oint\limits_{\bS{r}^s(\xi)} \dotsi % \end{equation*} % \end{verbatim} % gives % \begin{equation*} % \oint\limits_{\bS{r}^s(\xi)} \dotsi % \end{equation*} % \bigskip % % ^^A\clearpage % \section{Symbol formatting commands} % \subsection{Bold italic symbols} % % The symbol format can be set with the package options % \begin{sample} % \hskip14pc\=\kill % |\usepackage{mattens}| \>|% Uses \boldsymbol as default| % \end{sample} % or % \begin{sample} % \hskip14pc\=\kill % |\usepackage[noformat]{mattens}| \>|% No symbol formatting| % \end{sample} % or anywhere in the document with the command % \begin{Decl} % \cmd{\SetSymbFont}\marg{font-command}^^A % \SpecialUsageIndex{\SetSymbFont} % \end{Decl} % \noindent The \pkg{bm} package reroutes the \cmd{\boldsymbol} command to % point to \cmd{\bm}. If \cmd{\SetSymbFont}|{\boldsymbol}| is called after the % \pkg{bm} package is loaded, it is equivalent to \cmd{\SetSymbFont}|{\bm}|. % Bold formatting of individual tensors can also be switched off with the use % of the starred forms of the tensor commands. % % If the symbols are interpreted as tensors, then according to the ISO, it can % be typeset in a slanted sans serif font (if you are fond of fonts). For the % Computer Modern fonts with an \texttt{OT1} encoding, you can put in the % preamble % \begin{quote} % |\DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl}| % \end{quote} % Examples of formats are % \begin{sample} % |\SetSymbFont{\bm}| \>\SetSymbFont{\bm}$\aSb{E}_s$\\[1ex] % |\SetSymbFont{\relax}| \>\SetSymbFont{\relax}$\aSb{E}_s$\\[1ex] % |\SetSymbFont{\mathsfsl}| \>\SetSymbFont{\mathsfsl}$\aSb{E}_s$ % \end{sample} % \SetSymbFont{\bm} % % Only the first symbol (or group) in multi-symbol constructions is formatted. % This can be used to obtain % \begin{sample} % |\bS{{}xy}| ~|\bS*{xy}| \> $\bS{{}xy}$ ~ $\bS*{xy}$\\ % |\bS{xy}| \> $\bS{xy}$ \\ % |\bS{{xy}}| \> $\bS{{xy}}$ % \end{sample} % or % \begin{sample} % |\bCSb*{\bS{x}+\bS{y}}| \> $\bCSb*{\bS{x}+\bS{y}}$\\[1ex] % |\bSb{E_{313}}^s_r| \> $\bSb{E_{313}}^s_r$ % \end{sample} % % When a font does not have bold italic symbols and is properly configured, the % |\bm| command constructs the symbols with the ``poor man's bold'' method. % This results in the loss of the subscript kerning. This is the case for the % \pkg{mathptm}\ package for Times fonts. If bold italic symbols are needed for % Times fonts, it is advisable to use the \pkg{txfonts} package or one of the % commercial fonts. % % % \subsection{Struts} % % A strut can be inserted inside the tensor construction to force all the lines % to the same height. This can be given in the package options % \begin{sample} % \hskip14pc\=\kill % |\usepackage{mattens}| \>|% No strut as default | % \end{sample} % or % \begin{sample} % \hskip14pc\=\kill % |\usepackage[mathstrut]{mattens}| \>|% Uses \mathstrut | % \end{sample} % or anywhere in the document with the command % \begin{Decl} % \SpecialUsageIndex{\SetSymbStrut}^^A % \cmd{\SetSymbStrut}\marg{strut} % \end{Decl} % \noindent For example % \SetSymbStrut{\relax} % \begin{sample} % |\SetSymbStrut{\relax}| \\ % |\bSb{E}|, |\bS{f}|, |\Sb{y}| \>$\bSb{E}$, $\bS{x}$, $\Sb{y}$ % \end{sample} % \SetSymbStrut{\mathstrut} % \begin{sample} % |\SetSymbStrut{\mathstrut}| \\ % |\bSb{E}|, |\bS{f}|, |\Sb{y}| \>$\bSb{E}$, $\bS{x}$, $\Sb{y}$ % \end{sample} % \SetSymbStrut{\vphantom{E}} % \begin{sample} % |\SetSymbStrut{\vphantom{E}}| \\ % |\bSb{E}|, |\bS{f}|, |\Sb{y}| \>$\bSb{E}$, $\bS{x}$, $\Sb{y}$ % \end{sample} % \SetSymbStrut{\relax} % % \subsection{Additional sub- and superscript spaces} % % The placing of the sub- and superscripts was fine-tuned for Computer Modern % fonts. Other fonts may require the sub- and superscript to shift closer or % further away from the lines and the symbols. Additional spaces can be % inserted before the sub- and superscripts with the following commands: % \begin{Decl} % \cmd{\SetArrowSkip}\marg{muskip length}\\[.5ex] % \cmd{\SetBarSkip}\marg{muskip length}\\[.5ex] % \cmd{\SetSymSubSkip}\marg{muskip length}\\[.5ex] % \cmd{\SetSymSupSkip}\marg{muskip length} % \SpecialUsageIndex{\SetArrowSkip} % \SpecialUsageIndex{\SetBarSkip} % \SpecialUsageIndex{\SetSymSubSkip} % \SpecialUsageIndex{\SetSymSupSkip} % \end{Decl} % \noindent The length units must be in math units (\myemph{mu}), where % $18\,\mathit{mu}=1\,\mathit{em}$ (a little less than the width of the letter % ``M''). % % \section{Other packages and classes} % % \begin{description} % \item[\normalfont\pkg{bm}:\quad] The \pkg{bm} package is preferred % for bold\-/\-heavy symbols in math mode. It can also be used to % predeclare bold symbols for use with the starred form of the % tensor commands, for example: \SetSymbFont{\bm} % \begin{sample} % | \bmdefine{\bO}{\mathit{\Omega}}|\\ % |$\bSb*{\bO_i}$| \>\qquad\qquad\qquad $\bSb*{\bO_i}$ % \end{sample} % % \item[\normalfont\pkg{hyperref}:\quad] When tensor symbols are set in % chapter and section headers, \pkg{hyperref} crashes if the % \cmd{\texorpdfstring} command is not used. % \begin{sample} % |\section{A header with \texorpdfstring{$\bS{x}^i_j$}{xij} in it}| % \end{sample} % % \item[\normalfont\pkg{color}:\quad] To change the colour of a symbol % the \cmd{\color} command must be grouped two levels deep to % survive all the expansions if the \pkg{bm} package is loaded. % \begin{sample} % |$\aSb{{{\color{red}E}}}_i$| \> $\aSb{{{\color{red}E}}}_i$ % \end{sample} % % \item[\normalfont\pkg{slide}, \pkg{foils}:~~] The Euler math fonts % are definitely compulsory. The ratio of the sub- and superscript % sizes to normal math font sizes is too big inside the \pkg{slide} % class. For tensors such as $\bS{x}^j_k$, you may find that the % sub- and superscripts overlap. Choose your script characters % carefully. % % \item[\normalfont\pkg{eulervm}:\quad] The \Hass{} ideal of symbols % that are easily written by hand is satisfied with the beautiful % letters of the Euler fonts. This package is a must for % presentation material, but \myemph{please do not use bold Euler % symbols}, they just do not look right! % % \item[\normalfont\pkg{accents}:\quad] For the creation of alternative % accents the \MT\ package is fully compatible with the % \pkg{accents}\ package. As an example of its usage, the equation % in \Hass\cite{Hass93a}, \S10.1, p.82 % % \begin{minipage}{\textwidth} % \begin{verbatim} % \SetSymbFont{\relax} % \SetSymbStrut{\mathstrut} % \newcommand{\dotr}[1]{% % \accentset{\phantom{r}{\displaystyle.}r}{#1}} % \begin{equation*} % \text{apparent velocity} % = \frac{\partial_r}{\mathrm{d}t} \aS{r} % = \aS[\dotr]{r} % = \aSb{E}_s \tdot \bS[\dotr]{r}^s % \equiv \aS{v}_{\mathrm{app}} % = \aS{v}_{\mathrm{rel}} % \end{equation*} % \end{verbatim} % \end{minipage} % \medskip % % which gives\SetSymbFont{\relax}\SetSymbStrut{\mathstrut}% % \begin{equation*} % \text{apparent velocity} = % \frac{\partial_r}{\mathrm{d}t} \aS{r} = % \aS[\dotr]{r} = % \aSb{E}_s \tdot \bS[\dotr]{r}^s \equiv % \aS{v}_{\mathrm{app}} = % \aS{v}_{\mathrm{rel}} % \end{equation*} % \SetSymbStrut{\relax}\SetSymbFont{\bm} % \end{description} % ^^A\clearpage % % \section{Typesetting the \Hass{} notation in \LaTeX} % \subsection{Why?} % % The \Hass{} notation contains symbols such as, $\aS{e}_i$, % $\bS[\dot]{x}^{r}_{\alpha}$, $\bSa[\dot]{E}^s$, etc. These symbols % are quite common and variants thereof are found on many % blackboards of engineering schools. Based on the reputation of % \TeX{} it would seem trivial to typeset them, but to the contrary % ... % \SetSymbFont{\relax} % \begin{sample} % |\bS[\dot]{f}^a_b| \> $\bS[\dot]{f}^a_b$ ~~~(correct typesetting)\\[.75ex] % |$\dot{\overline{f}}^a_b$| \> \AccentBox\\[.75ex] % |$\dot{\overline{f}}{}^a_b$| \> $\dot{\overline{f}}{}^a_b$\\[.75ex] % |$\dot{\overline{f}^a_b}$| \> $\dot{\overline{f}^a_b}$ % \end{sample} % \SetSymbFont{\bm} % % When a subscript is inserted for slanted characters, e.g., % $f^a_b$, the subscript is kerned closer to the symbol. % This subscript kerning as well as the superscript height is % retained for math accents, e.g., $\dot{f}^a_b$. When % the \cmd{\overline} or \cmd{\overrightarrow} commands are used together % with math accents, the problems begin\footnote{If you are using % Equation Editor or MathType inside word processors in the Windows environment, % you end up with the same problems and have to fiddle \myemph{every} % sub- and superscript individually. A browse through the accompanying % sample document, \pkg{mtsample.tex}, will show that this can amount to % hundreds of little equations. I challenge anyone to rewrite that % document with one of the popular wordprocessors and still be sane % afterwards :-)}: % % \begin{itemize} % % \item For an \cmd{\overline}, $\overline{f}^a_b$, the superscript moves up to % the height of the overline, which is fine for vector notation, but the % subscript kerning is lost, because the symbol is set inside a box with % italic correction added (App. G of the \TeX{}book). If the subscript is % added inside the \cmd{\overline} construct, $\overline{f_b}^a$, the % overline is stretched, which is acceptable only when the subscript is % part of the symbol itself. The subscript kerning can be corrected by % attaching the subscript to the symbol and the superscript to the overline % and then overtyping (\cmd{\rlap} or \cmd{\llap}) them while using a % phantom symbol (without subscript) for the overline, % \begin{sample} % |\leavevmode\rlap{$\overline{\phantom{f}}^a$}%|\\ % | {$f^{}_b$}| % \end{sample} % which gives \leavevmode\rlap{$\overline{\phantom{f}}^a$}{$f^{}_b$}. % % The \cmd{\leavevmode} command is nessesary to prevent the symbol being % spread over two lines when it is the first token in a new paragraph % (\TeX{} in vertical mode). % % Care must be taken with the sequence in which the two parts overlap when % the one is wider than the other, % \leavevmode\rlap{$\overline{\phantom{f}}^{abcde}$}{$f^{}_a$}, % because the superscript will then run into the following text. % % \item If a math accent is added to the overline, \AccentBox, the superscript % goes to the level of the accent (except if the \pkg{accents}\ package is % loaded). This can be remedied by controlling the height of the accented % overline construction with a \cmd{\vphantom} commands as a strut, % \begin{sample} % |\leavevmode\rlap%|\\ % | {$\dot{\overline{\phantom{f}}}{\vphantom{\overline{f}}}^a$}%|\\ % | {$f^{}_b$}| % \end{sample} % which gives % \rlap{$\dot{\overline{\phantom{f}}}{\vphantom{\overline{f}}}^a$}^^A % {$f^{}_b$}. % % \item For an |\overrightarrow| in vector notation, ($\overrightarrow{i}_a$, % ~$\overrightarrow{iiii}_a\,$), the construction of the stretchable arrow % results in an arrow wider than most symbols, with the symbol centred % below it. The subscript ended up far removed from the symbol. For % multiple symbols, the arrow width is equal to the box containing the % letters, resulting in better-looking subscripts (but still without the % subscript kerning). The previous procedure can be used to correct the % subscript kerning, except that additional white space must be inserted % before the symbol to centre it beneath the arrow. % \begin{sample} % |\newlength{\Wspace}\settowidth{\Wspace}{$\overrightarrow{i}$}|\\ % |\newlength{\SymWdth}\settowidth{\SymWdth}{$i$}|\\ % |\addtolength{\Wspace}{-\SymWdth} |\\ % |\leavevmode\rlap{$\dot{\overrightarrow{\phantom{i}}}$}% |\\ % | {\hspace*{.5\Wspace}$i^{}_b$} | % \end{sample} % \newlength{\Wspace}\settowidth{\Wspace}{$\overrightarrow{i}$} % \newlength{\SymWdth}\settowidth{\SymWdth}{$i$} % \addtolength{\Wspace}{-\SymWdth} % which gives \rlap{$\dot{\overrightarrow{\phantom{i}}}$}{\hspace*{.5\Wspace}$i^{}_b$}. % % The commands can be optimized by using saveboxes, \myemph{but} the % symbols will not scale correctly when used as sub- or superscripts or in % the \cmd{\tfrac} macro. A solution is to nest the commands inside a % \cmd{\mathpalette} environment, but be warned, this is very expensive! % The commands \cmd{\phantom}, \cmd{\smash}, \cmd{\overrightarrow} (in % \pkg{amsmath}) are already inside \cmd{\mathpalette} macros, and \TeX{} % calls the arguments of a \cmd{\mathpalette} macro four times before % deciding on the dimensions. % % \item The shape of the arrow tip of the |\overrightarrow| command was % probably not designed for this type of application and is much too broad % in the final CM font version. This broad arrow shape is incidentally one % of last changes by Prof.~Knuth to the CM font symbols. The PostScript % version of the CM fonts typesets the arrow much better, but it is highly % likely that it is still the old outdated version of the symbol. % % \item The subscript heights differ for the cases with and without % superscripts, $x_b,\; x_b^a$. This is not very satisfactory for a % consistent matrix-tensor notation, but it can be remedied by inserting a % dummy superscript, |$x^{}_b$|, which then gives $x^{}_b$, $x_b^a$. % % \end{itemize} % The \MT\ package was developed to overcome (some of) the above-mentioned % problems and to typeset the \Hass{} matrix tensor symbols in a consistent % manner. % % % \subsection{To do's} % % \begin{itemize} % \item The vertical spacing between the symbols and the lines and % arrows differs, $\aSb{E}$, $\bSa{E}$. This problem cannot be % fixed easily and would need some additional struts or even a % rewriting of the arrows and lines commands. % % \item For the purists: The ends of the |\overrightarrow| are rounded % (ligature of symbols), while the ends of the |\overline| are % squared (\TeX{} line drawing). % \end{itemize} % \bigskip % % \begin{thebibliography}{7} % \bibitem{Hass93a} % \Hass, W.~C., % ``Matrix Tensor Notation Part I. Rectilinear Orthogonal Coordinates,'' % \textsl{Comput. Math. Appl.}, % \textbf{26}(3), 1993, pp. 55--93. % % \bibitem{Hass93b} % \Hass, W.~C., % ``Matrix Tensor Notation Part II. Skew and Curved Coordinates,'' % \textsl{Comput. Math. Appl.}, % \textbf{29}(11), 1993, pp. 1--103. % \end{thebibliography} % % \StopEventually{} ^^A end StopEventually % % \clearpage % % \section{The Code: \pkg{mattens.sty}} % \setlength{\parskip}{\smallskipamount} % \setlength{\parindent}{0pt} % % \begin{macrocode} %<*package> % \end{macrocode} % % % % \subsection{Identification} % % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{mattens}[2010/03/26 v1.3a Matrix/Tensors (DNJ Els)] % \end{macrocode} % % % % \subsection{Options} % % \begin{macro}{\MT@SymbStrt} % \begin{macro}{\SetSymbStrut} % Struts to set all the lines and arrows at % predetermined heights and depths. % \begin{macrocode} \newcommand*{\MT@SymbStrt}{} \newcommand*{\SetSymbStrut}[1]{\renewcommand*{\MT@SymbStrt}{#1}} \SetSymbStrut{\relax} \DeclareOption{mathstrut}{\SetSymbStrut{\mathstrut}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\MT@SymbFnt} % \begin{macro}{\SetSymbFont} % Initialize the symbol font formatting commands. % \begin{macrocode} \newcommand*{\MT@SymbFnt}{} \newcommand*{\SetSymbFont}[1]{\renewcommand*{\MT@SymbFnt}{#1}} \SetSymbFont{\boldsymbol} \DeclareOption{noformat}{\SetSymbFont{\relax}} % \end{macrocode} % \end{macro} % \end{macro} % % Process the options % \changes{1.3a}{2010 Mar 25}{Remove invalid UTF-8 byte sequences} % \begin{macrocode} \DeclareOption*{% \PackageWarning{mattens}{Unknown option: \CurrentOption}} \ProcessOptions\relax % \end{macrocode} % % % % \subsection{Packages} % % The \pkg{amsmath} package is loaded to provide the scalable % \cmd{\overrightarrow} and \cmd{\underrightarrow} commands, as % well as the \cmd{\boldsymbol} command for setting bold math % symbols. % % \begin{macrocode} \RequirePackage{amsmath} % \end{macrocode} % % % % \subsection{Workaround commands} % % \begin{macro}{\MT@Overarrow} % \begin{macro}{\MT@Underarrow} % We define over- and under-arrows that bypass the % \cmd{\mathpalette} part of the \pkg{amsmath} macros % \cmd{\overrightarrow} and \cmd{\underrightarrow}. It uses % the \pkg{amsmath} internal macros \cmd{\overarrow@}, % \cmd{\underarrow@} and \cmd{\rightarrowfill@}. % The first parameter |#1| consists of math styles \cmd{\displaystyle}, % \cmd{\textstyle}, etc. The second parameter |#2| is the symbol % or character. % \begin{macrocode} \newcommand{\MT@Overarrow}[2]{\overarrow@{\rightarrowfill@}{#1}{#2}} \newcommand{\MT@Underarrow}[2]{\underarrow@{\rightarrowfill@}{#1}{#2}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\MT@Overline} % \begin{macro}{\MT@Underline} % Make over- and underlines with the same calling syntax as % the arrows. % \begin{macrocode} \newcommand{\MT@Overline}[2]{{#1\overline{#2}}} \newcommand{\MT@Underline}[2]{{#1\underline{#2}}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\xusebox} % \changes{1.1}{2004 Jan 15}{More streamline.} % \changes{1.2}{2004 Jan 27}{Test if \pkg{pdftex.def} is loaded. % and command is rewritten to use a \cmd{\mathord} to % restore script heights} % The \cmd{\usebox} command does not function properly when the % \pkg{pdftex.def} driver is loaded, because \pkg{pdftex} does % not implement a colour stack such as in the \pkg{dvips} driver, % but simulate it at \TeX{} macro level. The \cmd{\xusebox} is % a workaround where the \cmd{\usebox} command is grouped.\footnote{ % Thanks to Heiko Oberdiek for this workaround} % A |\mathord| is added around the box to regain its height in the % \pkg{pdftex} case. % \begin{macrocode} \AtBeginDocument{% \@ifl@aded{def}{pdftex}% {\newcommand*{\xusebox}[1]{\mathord{{\usebox{#1}}}}}% {\let\xusebox\usebox}% } % \end{macrocode} % \end{macro} % % % % \subsection{Initialize} % % Define skip lengths for insertion in front of sub- and % superscripts. % \begin{macrocode} \newmuskip{\MT@Askip} \newmuskip{\MT@Bskip} \newmuskip{\MT@SPskip} \newmuskip{\MT@SBskip} % \end{macrocode} % % \begin{macro}{\SetArrowSkip} % \begin{macro}{\SetBarSkip} % \begin{macro}{\SetSymSupSkip} % \begin{macro}{\SetSymSubSkip} % Define commands to set or change the skip lengths and set initial values. % \begin{macrocode} \newcommand*{\SetArrowSkip}[1]{\MT@Askip#1} \newcommand*{\SetBarSkip}[1]{\MT@Bskip#1} \newcommand*{\SetSymSupSkip}[1]{\MT@SPskip#1} \newcommand*{\SetSymSubSkip}[1]{\MT@SBskip#1} \SetArrowSkip{0mu} \SetBarSkip{1mu} \SetSymSubSkip{0mu} \SetSymSupSkip{0mu} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\MT@SubSkip} % \begin{macro}{\MT@SupSkip} % Define math skip lengths to insert in front of the sub- and % superscripts. The values are set inside the main \MT\ commands % according to the type of symbol. % \begin{macrocode} \newmuskip\MT@SubSkip \newmuskip\MT@SupSkip % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsection{Main \MT\ commands} % % Setup command templates and lengths to function as global % variables and pointers. % % \begin{macro}{\MT@accent} % The \cmd{\MT@accent} command points % to the math accent that are inserted as the optional argument % inside the main \MT\ commands. % % \begin{macrocode} \newcommand*{\MT@accent}{} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@cmd} % \begin{macro}{\MT@@cmd} % The commands \cmd{\MT@cmd} and \cmd{\MT@cmd} do the actual % typesetting of the symbols. % \begin{macrocode} \newcommand*{\MT@cmd}{} \newcommand*{\MT@@cmd}{} % \end{macrocode} % \end{macro} % \end{macro} % % % They can be seen % as function pointer that are set with |\let| commands inside % the main \MT\ commands to point to specific commands. % % \newcommand{\RA}{\ensuremath{\,\mapsto\,}} % % \begin{tabbing} % \hskip2pc\=\hskip3pc\=\hskip12pc\=\kill % \>\textsl{Cmd} \> \textsl{Primary command} \> \textsl{Secondary command}\\[.75ex] % \>|\aS|: \>|\MT@cmd| \RA |\MT@OverAandB|, \>|\MT@@cmd| \RA |\MT@Overarrow|\\ % \>|\bS|: \>|\MT@cmd| \RA |\MT@OverAandB|, \>|\MT@@cmd| \RA |\MT@Overline|\\ % \>|\Sa|: \>|\MT@cmd| \RA |\MT@UnderAandB|, \>|\MT@@cmd| \RA |\MT@Underarrow|\\ % \>|\Sb|: \>|\MT@cmd| \RA |\MT@UnderAandB|, \>|\MT@@cmd| \RA |\MT@Underline|\\ % \>|\bSb|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@bSb| \\ % \>|\aSb|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@aSb|\\ % \>|\bSa|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@bSa| \\ % \>|\aSa|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@aSa|\\ % \>|\bCSb|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@bCSb|\\ % \>|\aCSa|: \>|\MT@cmd| \RA |\MT@DoubleAandB|, \>|\MT@@cmd| \RA |\MT@@aCSa|\\ % \end{tabbing} % % % \begin{macro}{\MT@bold} % The \cmd{\MT@bold} command is used internally and set by the % ``starred'' command option. % \begin{macrocode} \newcommand*{\MT@bold}{} % \end{macrocode} % \end{macro} % % \begin{macro}{\aS} % Type the tensor: $\aS{x}$ % \begin{macrocode} \DeclareRobustCommand*{\aS}{% \let\MT@cmd=\MT@OverAandB% \let\MT@@cmd=\MT@Overarrow% \MT@SupSkip=\MT@Askip% \MT@SubSkip=\MT@SBskip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\bS} % Type the tensor: $\bS{x}$ % \begin{macrocode} \DeclareRobustCommand*{\bS}{% \let\MT@cmd=\MT@OverAandB% \let\MT@@cmd=\MT@Overline% \MT@SupSkip=\MT@Bskip% \MT@SubSkip=\MT@SBskip% \MT@Tensor}% % \end{macrocode} % \end{macro} % % % \begin{macro}{\Sa} % Type the tensor: $\Sa{x}$ % \begin{macrocode} \DeclareRobustCommand*{\Sa}{% \let\MT@cmd=\MT@UnderAandB% \let\MT@@cmd=\MT@Underarrow% \MT@SupSkip=\MT@SPskip% \MT@SubSkip=\MT@Askip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\Sb} % Type the tensor: $\Sb{x}$ % \begin{macrocode} \DeclareRobustCommand*{\Sb}{% \let\MT@cmd=\MT@UnderAandB% \let\MT@@cmd=\MT@Underline% \MT@SupSkip=\MT@SPskip% \MT@SubSkip=\MT@Bskip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\bSb} % Type the tensor: $\bSb{E}$ % \begin{macrocode} \DeclareRobustCommand*{\bSb}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@bSb% \MT@SupSkip=\MT@Bskip% \MT@SubSkip=\MT@Bskip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\aSb} % Type the tensor: $\aSb{E}$ % \begin{macrocode} \DeclareRobustCommand*{\aSb}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@aSb% \MT@SupSkip=\MT@Askip% \MT@SubSkip=\MT@Bskip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\bSa} % Type the tensor: $\bSa{E}$ % \begin{macrocode} \DeclareRobustCommand*{\bSa}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@bSa% \MT@SupSkip=\MT@Bskip% \MT@SubSkip=\MT@Askip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\aSa} % Type the tensor: $\aSa{E}$ % \begin{macrocode} \DeclareRobustCommand*{\aSa}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@aSa% \MT@SupSkip=\MT@Askip% \MT@SubSkip=\MT@Askip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\bCSb} % Type the tensor: $\bCSb{\omega}$ % \begin{macrocode} \DeclareRobustCommand*{\bCSb}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@bCSb% \MT@SupSkip=\MT@Bskip% \MT@SubSkip=\MT@Bskip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\aCSa} % Type the tensor: $\aCSa{\omega}$ % \begin{macrocode} \DeclareRobustCommand*{\aCSa}{% \let\MT@cmd=\MT@DoubleAandB% \let\MT@@cmd=\MT@@aCSa% \MT@SupSkip=\MT@Askip% \MT@SubSkip=\MT@Askip% \MT@Tensor} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@Tensor} % \changes{1.1}{2004 Jan 15}{Added to reduce overall code.} % \begin{macro}{\MT@@Tensor} % \changes{1.1}{2004 Jan 15}{Added to reduce overall code.} % General tensor commands to look for starred form and % and initiate script extraction. % \begin{macrocode} \newcommand*{\MT@Tensor}{% \@ifstar{\let\MT@bold=\@firstofone\MT@@Tensor} {\let\MT@bold=\MT@SymbFnt\MT@@Tensor}} % \end{macrocode} % \begin{macrocode} \newcommand*{\MT@@Tensor}[2][\@firstofone]{% \let\MT@accent=#1\relax% \MT@GetScripts{#2}} % \end{macrocode} % \end{macro} % \end{macro} % % % % \subsection{Sub- and superscripts} % % % \begin{macro}{\MT@GetScripts} % This part of the code looks ahead for sub- and superscripts. % \changes{1.1}{2004 Jan 15}{Add: Code to check for primes} % \begin{macrocode} \newcommand*\MT@GetScripts[1]{% \@ifnextchar'% {\MT@GetPrimes{#1}{\prime}}% {\MT@UnprimedScripts{#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@GetPrimes} % \changes{1.1}{2004 Jan 15}{Add: Extract primes} % \begin{macro}{\MT@GetPrimedSuper} % \changes{1.1}{2004 Jan 15}{Add: Extract primes} % \begin{macro}{\MT@GetPrimedSub} % \changes{1.1}{2004 Jan 15}{Add: Extract primes} % Extract primes and look ahead for superscripts |^|. Note that % the sequence of operators for a primed symbol is: % \meta{symb}|'|$^{..}\!\!$|'^|\meta{sup}|_|\meta{sub} % \begin{macrocode} \newcommand*\MT@GetPrimes[3]{% \@ifnextchar'% {\MT@GetPrimes{#1}{#2\prime}}% {\@ifnextchar^% {\MT@GetPrimedSuper{#1}{#2}}% {\@ifnextchar_% {\MT@GetPrimedSub{#1}{#2}}% {\MT@SetScripts{#1}{#2}{\@empty}}% }% }% } % \end{macrocode} % \begin{macrocode} \def\MT@GetPrimedSuper#1#2^#3{% \@ifnextchar_{\MT@GetPrimedSub{#1}{#2#3}}% {\MT@SetScripts{#1}{#2#3}{\@empty}}} % \end{macrocode} % \begin{macrocode} \def\MT@GetPrimedSub#1#2_#3{% \MT@SetScripts{#1}{#2}{#3}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\MT@UnprimedScripts} % The first extraction command for symbols without primes. % It looks ahead for |^| or |_|, if not present, then pass % \cmd{\@empty} flags forward, otherwise it passes the tokens % on to the next extraction commands. % % \begin{macrocode} \newcommand*\MT@UnprimedScripts[1]{% \@ifnextchar^% {\MT@GetSuper{#1}}% {\@ifnextchar_% {\MT@GetSub{#1}}% {\MT@SetScripts{#1}{\@empty}{\@empty}}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@GetSuper} % Extract scripts of the form \meta{Sym}|^|\meta{sup} % if there are no further |_| tokens available, otherwise pass the % tokens on to the next extraction command. % % \begin{macrocode} \def\MT@GetSuper#1^#2{% \@ifnextchar_{\MT@GetSuperSub{#1}{#2}}% {\MT@SetScripts{#1}{#2}{\@empty}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@GetSub} % Extract scripts of the form \meta{Sym}|_|\meta{sub} % if there are no further |^| tokens available, otherwise pass the % tokens on to the next extraction command. % % \begin{macrocode} \def\MT@GetSub#1_#2{% \@ifnextchar^{\MT@GetSubSuper{#1}{#2}}% {\MT@SetScripts{#1}{\@empty}{#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@GetSuperSub} % Extract scripts of the form % \meta{Sym}|^|\meta{sup}|_|\meta{sub}. % % \begin{macrocode} \def\MT@GetSuperSub#1#2_#3{% \MT@SetScripts{#1}{#2}{#3}} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@GetSubSuper} % Extract scripts of the form % \meta{Sym}|_|\meta{sub}|^|\meta{sup}. % % \begin{macrocode} \def\MT@GetSubSuper#1#2^#3{% \MT@SetScripts{#1}{#3}{#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@SetSup} % \begin{macro}{\MT@SetSub} % Define global variables commands that contain the extracted % sub- and superscripts. These commands are redefined inside the % the final \cmd{\MT@SetScripts} command. % % \begin{macrocode} \newcommand*{\MT@SetSup}{} \newcommand*{\MT@SetSub}{} \newcommand*{\MT@SetSubS}{} % \end{macrocode} % \end{macro} % \end{macro} % % \changes{1.3}{2009 Sep 1}{Remove \cmd{\ensuremath} to force math mode.} % \begin{macrocode} \newcommand*\MT@SetScripts[3]{% \let\MT@SetSup\relax% \let\MT@SetSub\relax% \let\MT@SetSubS\relax% \ifx\@empty#2\@empty\else \def\MT@SetSup{^{\mskip\MT@SupSkip\relax#2}}% \fi \ifx\@empty#3\@empty\else \def\MT@SetSub{_{\mskip\MT@SubSkip\relax#3}}% \def\MT@SetSubS{^{}_{\mskip\MT@SubSkip\relax#3}}% \fi \MT@cmd{#1}} % \end{macrocode} % % % % \subsection{Symbol formatting} % % \begin{macro}{\MT@Symb} % This command type |{|\meta{strut}\meta{font-cmd}\meta{symb}|}|, % the formatted symbol preceded by the selected strut. It is called % from within the main typesetting commands. % % \begin{macrocode} \newcommand*{\MT@Symb}[1]{\MT@SymbStrt\MT@bold#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@SymbC} % Puts a widetilde over the symbol for the cross product tensors. % \begin{macrocode} \newcommand*{\MT@SymbC}[1]{% \MT@SymbStrt\widetilde{% \MT@bold#1}} % \end{macrocode} % \end{macro} % % % \subsection{Main typesetting commands} % % The commands in this section are the ones pointed to by % the \cmd{\MT@cmd} and \cmd{\MT@@cmd} commands to perform % the typesetting of the full tensor symbol. % % Declare some save boxes % \begin{macrocode} \newsavebox{\MT@Abox} % for overline/arrow \newsavebox{\MT@Sbox} % for symbol \newsavebox{\MT@Tbox} % for tempories \newsavebox{\MT@APbox} % for overline/arrow phantom \newsavebox{\MT@SPbox} % for symbol phantom % \end{macrocode} % and some lengths. % \begin{macrocode} \newlength{\MT@SPwdth} % symbol width \newlength{\MT@BPwdth} % Bar width \newlength{\MT@Wwdth} % leading whitespace width % \end{macrocode} % % \begin{macro}{\MT@OverAandB} % This command generates the tensor symbols $\aS{e}$ and $\bS{e}$. % It utilizes the \cmd{\mathpalette} macro for the sizing of the % final tensor. \LaTeX{} commands \cmd{\smash} and \cmd{\phantom} % with embedded \cmd{\mathpalette} calls are avoided to prevent % nested \cmd{\mathchoice} calls. % \begin{macrocode} \newcommand*{\MT@OverAandB}{% \mathpalette\MT@@OverAandB} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@@OverAandB} % \changes{1.2}{2004 Jan 27}{Use \cmd{\xusebox} inside accent % to account for \cmd{\dddot}.} % For this command the first parameter |#1| is supplied by % \cmd{\mathpalette} and consists of math styles \cmd{\displaystyle}, % \cmd{\textstyle}, etc. The second parameter |#2| is the original % \meta{symbol} from the call \cmd{\MT@cmd}|{|\meta{symbol}|}|. % % \begin{macrocode} \newcommand*{\MT@@OverAandB}[2]{% % \end{macrocode} % \begin{Indent}{5em} % Set the symbol inside a box for measurement purposes. % \end{Indent} % \begin{macrocode} \sbox{\MT@Tbox}{$\m@th#1\MT@Symb{#2}$}% % \end{macrocode} % \begin{Indent}{5em} % Make phantom symbol box (empty) with size identical to symbol. % \end{Indent} % \begin{macrocode} \setbox\MT@SPbox\null% \ht\MT@SPbox\ht\MT@Tbox% \dp\MT@SPbox\dp\MT@Tbox% \wd\MT@SPbox\wd\MT@Tbox% % \end{macrocode} % \begin{Indent}{5em} % Make overline/overarrow over phantom symbol box for measurement. % \end{Indent} % \begin{macrocode} \sbox{\MT@APbox}{$\m@th\MT@@cmd{#1}{\copy\MT@SPbox}$}% % \end{macrocode} % \begin{Indent}{5em} % Calculate width difference between symbol and arrow/overline. % \end{Indent} % \begin{macrocode} \setlength{\MT@Wwdth}{\the\wd\MT@APbox}% \addtolength{\MT@Wwdth}{-\the\wd\MT@SPbox}% % \end{macrocode} % \begin{Indent}{5em} % Make final symbol box with white space in front to center is % beneath the arrow/over line and subscript that follows. % \end{Indent} % \begin{macrocode} \sbox{\MT@Sbox}{$\m@th#1\hskip 0.5\MT@Wwdth\relax\MT@Symb{#2}\MT@SetSubS$}% % \end{macrocode} % \begin{Indent}{5em} % Add math accent to overline/overarrow and reset box dimensions to % original. % \end{Indent} % \begin{macrocode} \sbox{\MT@Tbox}{$\m@th#1\MT@accent{\xusebox{\MT@APbox}}$}% \ht\MT@Tbox\ht\MT@APbox% \dp\MT@Tbox\dp\MT@APbox% % \end{macrocode} % \begin{Indent}{5em} % Final overline/overarrow box including accent and superscript at end. % \end{Indent} % \begin{macrocode} \sbox{\MT@Abox}{$\m@th#1\xusebox{\MT@Tbox}\MT@SetSup$}% % \end{macrocode} % \begin{Indent}{5em} % Overtype the symbol and the overline/overarrow boxes. The wider % box of the two is typed last to ensure that the spacing after % the full tensor symbol is correct. % \end{Indent} % \begin{macrocode} \ifdim\wd\MT@Abox<\wd\MT@Sbox% \leavevmode\rlap{\usebox\MT@Abox}{\usebox\MT@Sbox}% \else% \leavevmode\rlap{\usebox\MT@Sbox}{\usebox\MT@Abox}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\MT@UnderAandB} % \begin{macro}{\MT@@UnderAandB} % \changes{1.2}{2004 Jan 27}{Make provisions for wide accents (\cmd{\dddot}).} % This command generates the tensor symbols $\Sa{e}$ and $\Sb{e}$. % It is identical to the previous command except the sub- and % superscripts are swapped and the phantom box is set to the width % of the accent. % \begin{macrocode} \newcommand*{\MT@UnderAandB}{% \mathpalette\MT@@UnderAandB} % \end{macrocode} % \begin{macrocode} \newcommand*{\MT@@UnderAandB}[2]{% \sbox{\MT@Tbox}{$\m@th#1\MT@accent{\MT@Symb{#2}}$}% \setbox\MT@SPbox\null% \wd\MT@SPbox\wd\MT@Tbox% \sbox{\MT@Tbox}{$\m@th#1\MT@Symb{#2}$}% \ht\MT@SPbox\ht\MT@Tbox% \dp\MT@SPbox\dp\MT@Tbox% \sbox{\MT@APbox}{$\m@th\MT@@cmd{#1}{\copy\MT@SPbox}$}% \setlength{\MT@Wwdth}{\the\wd\MT@APbox}% \addtolength{\MT@Wwdth}{-\the\wd\MT@SPbox}% \sbox{\MT@Sbox}{$\m@th#1% \hskip 0.5\MT@Wwdth\relax\MT@accent{\MT@Symb{#2}}\MT@SetSup$}% \sbox{\MT@Abox}{$\m@th#1\xusebox{\MT@APbox}\MT@SetSub$}% \ifdim\wd\MT@Abox<\wd\MT@Sbox% \leavevmode\rlap{\usebox\MT@Abox}{\usebox\MT@Sbox}% \else% \leavevmode\rlap{\usebox\MT@Sbox}{\usebox\MT@Abox}% \fi} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\MT@@bSb} % \begin{macro}{\MT@@bSa} % \begin{macro}{\MT@@aSb} % \begin{macro}{\MT@@aSa} % \begin{macro}{\MT@@bCSb} % \begin{macro}{\MT@@aCSa} % These commands are pointed to by \cmd{\MT@@cmd} and called from % within \cmd{\MT@DoubleAandB}. It has the same calling syntax as % the \cmd{\MT@Overarrow} and \cmd{\MT@Underarrow} commands. % \begin{macrocode} \newcommand*{\MT@@bSb}[2]{\MT@Overline{#1}{\MT@Underline{#1}{\MT@Symb{#2}}}} \newcommand*{\MT@@aSb}[2]{\MT@Overarrow{#1}{\MT@Underline{#1}{\MT@Symb{#2}}}} \newcommand*{\MT@@bSa}[2]{\MT@Overline{#1}{\MT@Underarrow{#1}{\MT@Symb{#2}}}} \newcommand*{\MT@@aSa}[2]{\MT@Overarrow{#1}{\MT@Underarrow{#1}{\MT@Symb{#2}}}} \newcommand*{\MT@@bCSb}[2]{\MT@Overline{#1}{\MT@Underline{#1}{\MT@SymbC{#2}}}} \newcommand*{\MT@@aCSa}[2]{\MT@Overarrow{#1}{\MT@Underarrow{#1}{\MT@SymbC{#2}}}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\MT@DoubleAandB} % \begin{macro}{\MT@@DoubleAandB} % \changes{1.2}{2004 Jan 27}{Use \cmd{\xusebox} inside accent % to account for \cmd{\dddot}.} % This command is used for the remaining tensor symbols and is not % so complex compared to the previous commands. % % \begin{macrocode} \newcommand*{\MT@DoubleAandB}{% \mathpalette\MT@@DoubleAandB} % \end{macrocode} % \begin{macrocode} \newcommand*{\MT@@DoubleAandB}[2]{% \sbox{\MT@Abox}{$\m@th#1\MT@@cmd{#1}{#2}$}% \sbox{\MT@Tbox}{$\m@th#1\MT@accent{\xusebox{\MT@Abox}}$}% \ht\MT@Tbox\ht\MT@Abox% \dp\MT@Tbox\dp\MT@Abox% \xusebox{\MT@Tbox}\MT@SetSup\MT@SetSub} % \end{macrocode} % \end{macro} % \end{macro} % % % \changes{1.1}{2004 Jan 15}{Code: Remove helper commands} % \begin{macrocode} % % \end{macrocode} % \clearpage % \Finale % \setcounter{IndexColumns}{2}\PrintIndex % \PrintChanges % \endinput