summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tensor/tensor.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-07-19 03:00:45 +0000
committerNorbert Preining <norbert@preining.info>2023-07-19 03:00:45 +0000
commitd3bd608be0e8ac816c5d16ef32b4e046f869713f (patch)
tree097fdd75903349fb5ad2ba18f9b6baee70215b2e /macros/latex/contrib/tensor/tensor.dtx
parent26db8c4a83cf4c293f2b285fb398e8d676dff136 (diff)
CTAN sync 202307190300
Diffstat (limited to 'macros/latex/contrib/tensor/tensor.dtx')
-rw-r--r--macros/latex/contrib/tensor/tensor.dtx359
1 files changed, 251 insertions, 108 deletions
diff --git a/macros/latex/contrib/tensor/tensor.dtx b/macros/latex/contrib/tensor/tensor.dtx
index edbf571b56..0bdad9e620 100644
--- a/macros/latex/contrib/tensor/tensor.dtx
+++ b/macros/latex/contrib/tensor/tensor.dtx
@@ -1,16 +1,24 @@
% \iffalse meta-comment
%
-% Copyright (C) 2004 by Philip G. Ratcliffe <philip.ratcliffe@uninsubria.it>
+%% File: tensor.dtx
+%%
+% Copyright (C) 2023 Philip G. Ratcliffe <philip.ratcliffe@uninsubria.it>
%
-% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, either version 1.2 of this license
-% or (at your option) any later version. The latest version of this
-% license is in:
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
%
% http://www.latex-project.org/lppl.txt
%
-% and version 1.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
+% This file is part of the "tensor package" (the Work in LPPL)
+% and all files in that package must be distributed together.
+%
+% The released version of this package is available from CTAN.
+%
+% This package has the LPPL maintenance status "maintained".
+%
+% The current maintainer of this package is Philip G. Ratcliffe.
%
% \fi
%
@@ -18,19 +26,21 @@
%
%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{tensor}
-%<package> [2004/12/20 v2.1 tensor indices package (PGR)]
+%<package> [2023/07/18 v2.2 tensor indices package (PGR)]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{tensor}
-\providecommand\DescribeOther[1]{%
- \leavevmode
- \marginpar{\raggedleft\PrintDescribeEnv{#1}}%
- \index{#1|usage}%
-}
+\NewDocElement[macrolike=false]{Argument}{argument}
+\NewDocElement[macrolike=false]{Option}{option}
+%
\CodelineIndex
\EnableCrossrefs
\RecordChanges
+\DoNotIndex{\let,\def,\gdef,\newcommand,\renewcommand}
+\DoNotIndex{\if,\else,\fi,\ifx,\fi,\iffalse,\fi,\iftrue,\fi}
+\DoNotIndex{\@empty,\expandafter,\makebox,\relax,\string,\the,\z@}
+\DoNotIndex{\MessageBreak,\on@line}
%
\begin{document}
\DocInput{tensor.dtx}
@@ -38,7 +48,7 @@
%</driver>
% \fi
%
-% \CheckSum{269}
+% \CheckSum{342}
%
% \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
@@ -59,32 +69,31 @@
%
% \changes{v1.0}{1996/06/03}{original version}
% \changes{v2.0}{2004/04/01}{extended \cs{tensor}, added \cs{indices} and
-% \cs{nuclide}, substituted \cs{DeclareRobustCommand} for \cs{newcommand} in
+% \cs{nuclide}, substituted \cs{newcommand} with \cs{DeclareRobustCommand} in
% user commands, documented and packaged}
%
% \GetFileInfo{tensor.sty}
%
% \DoNotIndex{\CodelineIndex,\EnableCrossrefs,\RecordChanges}
%
-% \title{
+% \title{%
% The \textsf{tensor}\relax
-% \thanks{
-% This file has version number \fileversion, and revision date \filedate.}
-% \thanks{
+% \,\thanks{%
% Based on and extending the original package of the same name by Mike Piff
% (1996/06/03).}
% \space
% package for \LaTeX2e
% }
-% \author{
-% Philip G. Ratcliffe\thanks{E-mail: \textsf{philip.ratcliffe@uninsubria.it}}
+% \author{%
+% Philip G. Ratcliffe\relax
+% \,\thanks{E-mail: \textsf{philip.ratcliffe@uninsubria.it}}
% \\
-% Dipartimento di Fisica e Matematica
+% Dipartimento di Scienza e Alta Tecnologia
% \\
-% Universit\`{a} degli Studi dell'Insubria---Como
+% Universit\`a degli Studi dell'Insubria---Como
% }
%
-% \date{}
+% \date{(\fileversion, last revision \filedate)}
%
% \maketitle
%
@@ -93,24 +102,24 @@
% package; it defines two commands for typesetting tensors with mixed upper and
% lower indices in which the correct horizontal spacing must be observed.
% Various forms of alignment are available and spaces may be replaced by dots
-% or other symbols. Correct preposing of indices is now made possible while
+% or other symbols. Consistent preposing of indices is now made possible while
% backwards compatibility is maintained. A special-purpose command to typeset
% nuclides is also defined.
% \end{abstract}
%
% \section{Introduction}
%
-% The use of tensors with mixed upper and lower indices, in which the relative
-% horizontal positions and spacing are significant, is common in both
-% physics and mathematics; for example,
+% It is common in both physics and mathematics to use tensors with mixed upper
+% and lower indices in which the relative horizontal positions and spacing are
+% significant, for example
% \begin{displaymath}
% \Gamma\indices{^\mu_{\nu\rho}},\quad R\indices{^\mu_\nu^\rho_\sigma}
% \quad\mathrm{or}\quad
% \epsilon\indices{^\mu^\nu^\rho_\sigma}.
% \end{displaymath}
-% The commands defined in this package automatically maintain the correct
-% horizontal positioning. Another common need addressed by this
-% package is the preposing of upper and lower indices, as in
+% The macros defined in this package automatically maintain consistent
+% horizontal positioning. Another common need addressed is the
+% preposing of upper and lower indices, as in
% \begin{displaymath}
% \tensor
% [_{\rm H}]
@@ -121,18 +130,20 @@
% \end{displaymath}
% Note the correct spacing of the pre-index H in the above example. It should
% also be noted that constant vertical positioning is maintained for lone
-% indices; consider the following (examine carefully the last lower index $o$):
+% indices; consider the following (examine carefully the last lower index $o$
+% on the right):
% \begin{displaymath}
% {\rm M}\indices*{^o_o} \vert \tensor[_o]{{\rm M}}{}
% \quad\mbox{\emph{cf.}}\quad
% {\rm M}^o_o \vert _o{\rm M},
% \end{displaymath}
-% where the former group was typeset using \cs{indices} but the latter not.
+% where the former group was typeset using \cs{indices}, the latter using `|_|'
+% and `|^|'.
%
% \section{Usage}
%
% Two robust math-mode commands, \cs{tensor} and \cs{indices}, are defined (the
-% first of which remains backward compatible with Mike Piff's original
+% first of which remains backwards compatible with Mike Piff's original
% definition). A new, robust text- and math-mode command, \cs{nuclide}, is also
% defined specifically for typesetting nuclides, as in the above example.
%
@@ -141,36 +152,39 @@
% \DescribeMacro{\indices}
% To produce a mathematical expression (typically a tensor) with mixed upper
% and lower indices, simply enter
-% \meta{object}|\indices{|\relax
-% |^|\meta{sup$_{\,1}$}|_|\meta{sub$_{\,1}$}\relax
-% |^|\meta{sup$_{\,2}$}|_|\meta{sub$_{\,2}$}\relax
+% \meta{object}|\indices{|%
+% |^|\meta{sup$_{\,1}$}|_|\meta{sub$_{\,1}$}%
+% |^|\meta{sup$_{\,2}$}|_|\meta{sub$_{\,2}$}%
% \dots|}|.
-% Thus, in math mode it is sufficient to type, \emph{e.g.},
+% Thus, in math mode it is sufficient to type \emph{e.g.}
% \begin{center}
% |M\indices{^a_b^{cd}_e}|\quad to obtain\quad
% $M\indices{^a_b^{cd}_e}$.
% \end{center}
%
% \DescribeMacro{\tensor}
-% This variant has been retained in a backward compatible form and considerably
-% extended; the syntax for the previous expression is |\tensor{M}{^a_b^{cd}_e}|
-% while the resulting output is identical. The extended form of \cs{tensor} now
-% defined has an optional argument for indices to be placed \emph{before} the
-% tensor, thus:
+% This variant has been retained in a completely backwards compatible form
+% while also being considerably extended; the syntax for the previous
+% expression is |\tensor{M}{^a_b^{cd}_e}|, for which the resulting output is
+% identical. The extended form of \cs{tensor} defined here has an optional
+% argument for indices to be placed \emph{before} the tensor, thus:
% \begin{center}
-% |\tensor[^a_b^c_d]{M}{^a_b^c_d}|\quad produces\quad
-% $\tensor[^a_b^c_d]{M}{^a_b^c_d}$
+% |\tensor[^a_b^c_d]{M}{^e_f^g_h}|\quad produces\quad
+% $\tensor[^a_b^c_d]{M}{^e_f^g_h}$.
% \end{center}
% A fairly robust (if somewhat crude) attempt is made to ensure the correct
% spacing and skew of the preposed indices with respect to the tensor object
% itself.
%
+% Note that also \cs{sb} and \cs{sp} may be used in place of `|_|' and `|^|'
+% respectively for both the above macros.
+%
% \DescribeMacro{\indices*}
% \DescribeMacro{\tensor*}
-% The two commands have starred forms, which collapse the spacing (\emph{i.e.},
+% These two macros have starred forms, which collapse the spacing (\emph{i.e.}
% return to standard form). While \cs{indices*} is clearly redundant (and is
% included merely for symmetry), \cs{tensor*} also \emph{right} justifies the
-% \emph{pre}-index strings, so that, \emph{e.g.}, nuclides may be typeset as
+% \emph{pre}-index strings, so that \emph{e.g.} nuclides may be typeset as
% follows (though see below for a purpose-built command):
% \begin{center}
% |\tensor*[^{14}_6]{\mathrm{C}}{}|\quad produces\quad
@@ -187,8 +201,8 @@
% \end{center}
% The output appears identical to that of |\sideset{_*^*}{_*^*}{\prod}|.
%
-% \DescribeOther{* argument}
-% The \cs{indices*} and \cs{tensor*} forms \emph{only}, allow a |*| to also be
+% \DescribeArgument{*}
+% The \cs{indices*} and \cs{tensor*} forms \emph{alone}, allow a |*| to also be
% placed as the first entry in either index-list argument, causing alignment
% (\emph{left} justification) of the successive pairs of upper and lower
% indices. A warning is issued if a |*| appears in an argument string of either
@@ -216,10 +230,11 @@
% after which,\hspace*{\stretch{2}}
% \\
% |\tensor{M}{^a_b^c_d}|
-% \\[2ex]
-% produces\hspace{\stretch{2}}
+% \\[1ex]
+% produces\hspace*{\stretch{2}}\null
+% \\
% $\renewcommand\indexmarker{\cdot}\tensor{M}{^a_b^c_d}$\quad instead of\quad
-% $\tensor{M}{^a_b^c_d}$ \hspace*{3.5em}\hspace*{\stretch{2}}
+% $\tensor{M}{^a_b^c_d}$\,.
% \end{center}
%
% \DescribeMacro{\nuclide}
@@ -236,51 +251,125 @@
% is a little more space (|1mu|) between the numbers and the chemical symbol
% than appears in the example constructed manually with \cs{tensor*}.
%
-% All the above-defined commands may be used recursively, \emph{i.e.}, a
+% All the above-defined commands may be used recursively, \emph{i.e.} a
% \cs{tensor} may occur as an index to another \cs{tensor} and should behave
-% according to the current superscript--subscript level. Where useful, user
-% commands are defined as `robust'; thus, they may appear as arguments to
-% \cs{caption}, \cs{section} \emph{etc}.
+% according to the current superscript--subscript level. The user commands are
+% defined here as `robust'; they may thus appear as so-called moving arguments,
+% \emph{i.e.} to \cs{caption}, \cs{section} \emph{etc}.
%
% \DescribeMacro{\nuclideFont}
-% By default, the font for \cs{nuclide} is \cs{mathrm}, but \cs{nuclideFont}
-% may be reset with \cs{renewcommand} to \cs{mathsf}, \cs{mathbf}, \cs{mathtt}
-% \emph{etc}., or simply \cs{relax} (this last has the chemical symbol font
-% default to \cs{mathit} for correct spacing).
+% \DescribeMacro{\massnumFont}
+% By default, the fonts used in \cs{nuclide} for the chemical symbol, mass and
+% atomic numbers are \cs{mathrm}; \emph{i}.\emph{e}., \cs{nuclideFont} (for the
+% chemical symbol) is initially defined as \cs{mathrm} and \cs{massnumFont}
+% (for the mass/atomic numbers) as \cs{nuclideFont} (for backwards
+% compatibility). This then now allows for independent font variation of the
+% chemical symbol and mass/atomic numbers. Both macros may be reset with
+% \cs{renewcommand} to \cs{mathsf}, \cs{mathbf}, \cs{mathtt} \emph{etc}., or
+% simply \cs{relax} (this last for \cs{nuclideFont} has the chemical symbol
+% font default to \cs{mathit} for correct spacing, while for \cs{massnumFont}
+% the mass and atomic numbers revert to standard math font).
+%
+% \subsection{Package options}
+%
+% As of v2.2, the package includes four options relating to the vertical
+% alignment of indices. \LaTeX's behaviour in this regard is not always optimal
+% or what the user may desire. Consider the following output (constructed using
+% `|_|' and `|^|'.):
+% \begin{displaymath}
+% \epsilon\indices{^\mu_\rho^\nu_{\tilde\lambda}} \;
+% g\indices{^\mu^\nu} \,.
+% \end{displaymath}
+% While the indices within each single mathematical object are mutually
+% vertically aligned correctly, between separate objects they may not be. This
+% is because \LaTeX\ sets the baseline according to the height and depth of the
+% given indices on a per-object basis. To obviate such behaviour, this package
+% takes the simplest route of using \cs{smash} to hide the height and depth of
+% each superscript and subscript string so that they are always set with the
+% same baselines. This naturally leads to a somewhat cramped form (superscripts
+% are set a little too low and subscripts high) and so a specially defined
+% \cs{strut} is included, which slightly raises superscripts and lowers
+% subscripts; by default, this is only implemented in displayed math, as the
+% impact on inline text may be too disruptive.
+%
+% \DescribeOption{align}
+% \DescribeOption{text}
+% \DescribeOption{nosmash}
+% \DescribeOption{nostrut}
+% The options thus introduced are |align|, |text|, |nosmash| and |nostrut|. The
+% first implements both \cs{smash} and a \cs{strut} as outlined above, with
+% |text| extending the implementation of the \cs{strut} to inline text, while
+% |nosmash| and |nostrut| cancel the single effects (using both entirely
+% negates |align|). Option ordering is irrelevant and the last three are
+% inoperative without the first.
+%
+% The desired effects are implemented via two internal commands, which may also
+% be redefined by the user.
+% \DescribeMacro{\tensorSmash}
+% The first, \cs{tensorSmash}, is set equal to \cs{smash}, which then takes each
+% index string as an argument.
+% \DescribeMacro{\tensorStrut}
+% The second, \cs{tensorStrut}, is set equal to the height of `|l|' and depth
+% of `|j|' in the relevant font, (by default though only inside displayed math
+% environments) and is appended to each \cs{smash}'ed index string.
%
% \subsection{Caveats}
%
-% Grouping of multi-token indices should be performed as normal (\emph{i.e.},
+% Grouping of multi-token indices should be performed as normal (\emph{i.e.}
% via enclosure within a brace pair |{|\,|}|). Moreover, owing to the method by
% which index strings are parsed, any index constructs such as |\mathrm{H}|
% must also be entirely enclosed in braces, thus: |\indices{_{\mathrm{H}}^x}|.
%
-% Spacing is not guaranteed to always appear absolutely perfect, especially
-% between \emph{pre}-pended indices and the tensor object itself. Please also
-% recall, however, that screen viewing often distorts small spaces owing to
-% resolution effects.
+% Spacing is not guaranteed to always appear optimal, especially when between
+% \emph{pre}-pended indices and the tensor object itself. Recall too that
+% screen viewing often distorts small spaces owing to resolution effects.
%
% \subsection{External package requirements}
%
-% No external packages are required.
+% No external packages are required or called.
%
% \subsection{Package conflicts}
%
-% There are no known conflicts with any standard \LaTeX2e\ packages (a problem
-% with the |color| package in the first version has now been corrected).
-% However, there is obvious incompatibility with the similar |tensind| package.
+% There are few conflicts with standard \LaTeX2e\ packages; a problem with the
+% |color| package in the first version has now been corrected, as too a
+% recently flagged problem with the |underscore| package.
+%
+% However, the macros defined here fail as arguments of \cs{bm} from the |bm|
+% package (due to parsing conflicts) or, consequently, of macros defined by the
+% \cs{maybebm} package. A work around for, say, a chapter or section header is
+% \begin{center}
+% |{\let\nuclideFont\maybebm \nuclide[4][2]{\textup{He}}}|,
+% \end{center}
+% which should render \nuclide[\mathbf4][\mathbf2]{\textbf{He}} in the header,
+% but \nuclide[4][2]{\textup{He}} in the contents listing.
%
% \StopEventually{\PrintChanges\PrintIndex}
%
% \section{Implementation}
%
+% \subsection{User options}
+%
+% First, the package options with their related \cs{if}\dots\ conditionals are
+% defined and processed.
+% \begin{macrocode}
+\newif\iftnsr@Aln
+\DeclareOption{align}{\tnsr@Alntrue}
+\newif\iftnsr@Txt
+\DeclareOption{text}{\tnsr@Txttrue}
+\newif\iftnsr@Sma \tnsr@Smatrue
+\DeclareOption{nosmash}{\tnsr@Smafalse}
+\newif\iftnsr@Str \tnsr@Strtrue
+\DeclareOption{nostrut}{\tnsr@Strfalse}
+\ProcessOptions
+% \end{macrocode}
+%
% \subsection{User commands}
%
-% The |tensor| package now defines three basic user commands:
+% The |tensor| package defines three basic user commands:
% \begin{macro}{\tensor}
% The first takes three possible arguments (an optional index string to be
% \emph{preposed}, the tensor object, the index string) and also has a starred
-% form, which suppresses spacing (it is backward compatible with Mike Piff's
+% form, which suppresses spacing (it is backwards compatible with Mike Piff's
% original version).
% \begin{macrocode}
\DeclareRobustCommand\tensor{%
@@ -290,10 +379,10 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\indices}
-% The second command is a ``lightweight'' form, which is placed immediately
+% The second is a `\emph{lightweight}' form, which is placed immediately
% \emph{following} the tensor object, takes just one argument (the index
-% string) and also has a starred form (this command was \emph{not} present in
-% the original package).
+% string) and also has a starred form (this form was \emph{not} however present
+% in the original package).
% \changes{v2.1}{2004/12/20}{added starred form, for symmetry with
% \cs{tensor*}}
% \begin{macrocode}
@@ -307,7 +396,7 @@
% \begin{macro}{\nuclide}
% This additional new command takes one direct argument (an optional mass
% number) and two indirect arguments (an optional atomic number, the chemical
-% symbol---these last two are handled by auxiliary macros). Since usage is
+% symbol---these last two are handled by an auxiliary macro). Since usage is
% common in text, math mode is ensured.
% \begin{macrocode}
\DeclareRobustCommand\nuclide[1][]{%
@@ -318,14 +407,18 @@
% \end{macro}
%
% \begin{macro}{\nuclideFont}
-% This sets the font for \cs{nuclide} (the default is \cs{mathrm}); it may be
-% redefined as, \emph{e.g.}, \cs{mathsf}, \cs{mathbf}, \cs{mathtt}, \cs{mathit}
-% \emph{etc}., or even simply \cs{relax} (this last has the chemical symbol
-% font default to \cs{mathit} for correct spacing).
+% \begin{macro}{\massnumFont}
+% These set the fonts for \cs{nuclide}; the defaults are \cs{mathrm} for both
+% \cs{nuclideFont} and \cs{massnumFont}. They may be redefined as \emph{e.g.}
+% \changes{v2.2}{2023/07/18}{added independent mass/atomic-no.\ font control}
+% \cs{mathsf}, \cs{mathbf}, \cs{mathtt}, \cs{mathit} \emph{etc}., or even
+% simply \cs{relax} or \cs{renewcommand}\cs{nuclideFont}|{}|.
% \begin{macrocode}
\newcommand\nuclideFont{\mathrm}
+\newcommand\massnumFont{\nuclideFont}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsection{Internal token registers}
%
@@ -365,15 +458,18 @@
% \subsection{Internal macros}
%
% \begin{macro}{\tnsr@Prp}
+% \begin{macro}{\tnsr@Wrn}
% Here we simply reset token registers and the warning macro before commencing.
% \begin{macrocode}
+\newcommand\tnsr@Wrn{}
\newcommand\tnsr@Prp{%
\tnsr@Sps{}%
\tnsr@Sbs{}%
- \let\tnsr@Wrn\relax
+ \def\tnsr@Wrn{}
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\ndcs@Aux}
% This (lightweight) auxiliary macro for \cs{indices} takes one argument (an
@@ -381,7 +477,8 @@
% warnings.
% \begin{macrocode}
\newcommand\ndcs@Aux[1]{%
- \def\tnsr@Obj{}
+ \tnsr@Erx
+ \def\tnsr@Obj{}%
\tnsr@Set{#1}%
\tnsr@Fin
\tnsr@Wrn
@@ -395,6 +492,7 @@
% passes everything via \cs{mathpalette} to \cs{tnsr@Plt}.
% \begin{macrocode}
\newcommand\tnsr@Aux[3][]{%
+ \tnsr@Erx
\mathpalette{\tnsr@Plt{#1}{#3}}{#2}%
\tnsr@Wrn
}
@@ -407,9 +505,9 @@
% \cs{tnsr@Set} separately for both pre- and post-index strings.
% \begin{macrocode}
\newcommand\tnsr@Plt[4]{%
- \def\tnsr@Obj{#3#4}
- \def\reserved@a{#1}%
- \ifx\reserved@a\@empty\else
+ \def\tnsr@Obj{#3#4}%
+ \def\tnsr@Tmp{#1}%
+ \ifx\tnsr@Tmp\@empty\else
\tnsr@Set{#1}%
\hphantom{{}\tnsr@Fin}%
\tnsr@Sps\expandafter{%
@@ -438,7 +536,7 @@
% \begin{macro}{\tnsr@Krn}
% This has one argument (a processed index string) and inserts the necessary
% offsets.
-% \changes{v2.1}{2004/12/20}{altered spacing slightly}
+% \changes{v2.1}{2004/12/20}{slightly altered spacing}
% \begin{macrocode}
\newcommand\tnsr@Krn[1]{%
\settowidth\@tempdima{$\m@th\tnsr@Obj^{#1}\mkern-1mu$}%
@@ -453,17 +551,19 @@
% \begin{macro}{\tnsr@Pro}
% This is the index-string processing macro, it takes one argument (an index
% string):
+% \changes{v2.2}{2023/07/18}{substituted \cs{ifx} with \cs{if} to avoid
+% \textsf{underscore} package conflict}
% \begin{macrocode}
\newcommand\tnsr@Pro[1]{%
\ifx#1\tnsr@Err
\let\tnsr@Nxt\relax
\else
- \ifx#1*
+ \if#1*
\iftnsr@Spc
\gdef\tnsr@Wrn{%
\PackageWarning{tensor}{%
- `*' not allowed in argument here, I am ignoring it,%
- \MessageBreak remove it or use `\string\tensor*',%
+ '*' not allowed in argument here; I shall ignore it.%
+ \MessageBreak Either remove it or use '\string\tensor*'%
}%
}%
\else
@@ -471,10 +571,10 @@
\fi
\let\tnsr@Nxt\tnsr@Pro
\else
- \ifx#1^
+ \if#1^
\def\tnsr@Nxt{\tnsr@Add{\tnsr@Sps}{\tnsr@Sbs}{\tnsr@Spe}}%
\else
- \ifx#1_
+ \if#1_
\def\tnsr@Nxt{\tnsr@Add{\tnsr@Sbs}{\tnsr@Sps}{\tnsr@Sbe}}%
\else
\tnsr@Err
@@ -497,7 +597,7 @@
%
% \begin{macro}{\tnsr@Swb}
% Here we flip the state of \cs{tnsr@Swx} to \cs{tnsr@Swa} then calculate and
-% insert the necessary padding for index alignment.
+% insert the necessary padding for horizontal index alignment.
% \begin{macrocode}
\newcommand\tnsr@Swb{%
\let\tnsr@Swx\tnsr@Swa
@@ -509,13 +609,13 @@
\tnsr@Sbs\expandafter\expandafter\expandafter{%
\expandafter\the\expandafter\tnsr@Sbs
\expandafter\kern\the\@tempdima
- }
+ }%
\else
\@tempdima=-\@tempdima
\tnsr@Sps\expandafter\expandafter\expandafter{%
\expandafter\the\expandafter\tnsr@Sps
\expandafter\kern\the\@tempdima
- }
+ }%
\fi
\fi
}
@@ -529,8 +629,7 @@
% index token to the upper or lower string and (if spacing is \emph{on}) a
% place-holder (\cs{tnsr@Hph}) of the same size to the lower or upper string,
% respectively. It also calls \cs{tnsr@Swx} to flip state (if activated). The
-% use of \cs{leavevmode} is necessary to avoid conflict with the |color|
-% package.
+% use of \cs{leavevmode} avoids conflict with the |color| package.
% \changes{v2.1}{2004/12/20}{added \cs{leavevmode}, to avoid \textsf{color}
% package conflict}
% \begin{macrocode}
@@ -575,20 +674,59 @@
%
% \begin{macro}{\tnsr@Fin}
% Finally, we put the index strings into place:
+% \changes{v2.2}{2023/07/18}{added vertical alignment capability}
% \begin{macrocode}
-\newcommand\tnsr@Fin{^{\the\tnsr@Sps}_{\the\tnsr@Sbs}}
+\newcommand\tnsr@Fin{%
+ ^{\tensorSmash{\the\tnsr@Sps}\tnsr@Str}%
+ _{\tensorSmash{\the\tnsr@Sbs}\tnsr@Str}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tensorSmash}
+% Initialise \cs{tensorSmash} as \cs{relax} and then conditionally set it equal
+% to \cs{smash} (it is user redefinable).
+% \begin{macrocode}
+\let\tensorSmash\relax
+\iftnsr@Aln
+ \iftnsr@Sma
+ \let\tensorSmash\smash
+ \fi
+\fi
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\tensorStrut}
+% \begin{macro}{\tnsr@Str}
+% Initialise \cs{tensorStrut} as \cs{relax} and then conditionally set it to
+% the height and depth of `|jl|'. By default, it is only applied to displayed
+% math environments (passed on via \cs{tnsr@Str}, which is \cs{def}'ed as
+% \cs{tensorStrut} to be user redefinable), but always (\emph{i.e.} extended to
+% inline text) if the package option |text| is present.
+% \begin{macrocode}
+\newcommand\tensorStrut{}
+\let\tnsr@Str\relax
+\iftnsr@Aln
+ \iftnsr@Str
+ \renewcommand\tensorStrut{\vphantom{jl}}
+ \iftnsr@Txt
+ \def\tnsr@Str{\tensorStrut}
+ \else
+ \everydisplay\expandafter{\the\everydisplay\let\tnsr@Str\tensorStrut}
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\ncld@Aux}
-% This auxiliary macro takes two arguments (an optional atomic number, a
-% chemical symbol). The mass number is passed via \cs{ncld@Mno}. Math mode is
-% ensured since usage is common in text. The spacing is increased by |1mu| for
-% better appearance.
+% This auxiliary macro takes two arguments (an optional atomic number and the
+% chemical symbol). The mass number is passed on via \cs{ncld@Mno}. Math mode
+% is ensured since usage is common in text. The spacing is increased by |1mu|
+% for better appearance.
% \begin{macrocode}
\newcommand\ncld@Aux[2][]{%
\ensuremath{%
- \tensor*[^{\nuclideFont{\the\ncld@Mno}}_{\nuclideFont{#1}}]%
+ \tensor*[^{\massnumFont{\the\ncld@Mno}}_{\massnumFont{#1}}]%
{\mkern1mu{\mathit{\nuclideFont{#2}}{}}}{}%
}%
}
@@ -596,13 +734,18 @@
% \end{macro}
%
% \begin{macro}{\tnsr@Err}
-% This is invoked in the only error situation considered.
+% This is invoked in the only error situations considered.
% \begin{macrocode}
-\newcommand\tnsr@Err{%
- \PackageError{tensor}{%
- Sub/Superscript items out of order\on@line,
- \MessageBreak some index tokens may now have been lost%
- }{An index string has an extra or missing `^' or `_' token.}%
+\newcommand\tnsr@Err{}
+\newcommand\tnsr@Erx{%
+ \def\tnsr@Err{%
+ \global\let\tnsr@Err\relax
+ \PackageError{tensor}{%
+ Misordered sub/superscript items\on@line;
+ \MessageBreak index tokens may have been lost.
+ \MessageBreak Press <return> and I shall try to continue%
+ }{Index string probably has extra/missing '^' or '_'.}%
+ }%
}
% \end{macrocode}
% \end{macro}
@@ -611,4 +754,4 @@
%
\endinput
%%
-%% End of file `tensor.dtx'.
+%% End of file 'tensor.dtx'.