% % \iffalse meta-comment % % Copyright 1995, 1999 American Mathematical Society. % Copyright 2016-2017 LaTeX3 Project and American Mathematical Society. % Copyright 2019 Martin Vermeer. % % 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 % https://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'. % % The Current Maintainer of this work is Martin Vermeer. % % \fi % %\iffalse %<*driver> \documentclass{amsdtx} \usepackage{amscdx} \usepackage{amsmath,calc} \GetFileInfo{amscdx.sty} % Dummy citation to avoid error in an example. \bibcite{fre:cichon}{C} \begin{document} \title{The \pkg{amscd\textcolor[RGB]{255,0,0}{x}} package} \author{\textcolor{red}{Martin Vermeer}\thanks{firstname.lastname$@$aalto.fi},\\ based on \pkg{amscd} by\\ Frank Mittelbach, Rainer Sch\"opf and Michael Downes} \date{Version \fileversion, \filedate} \DocInput{amscdx.dtx} \end{document} % %\fi % % \maketitle % This file is maintained by Martin Vermeer.\\% % % \MakeShortVerb\| % \renewcommand{\operatorname}[1]{\mathop{\mathrm{#1}}} % \newcommand{\per}{\operatorname{per}} % \newcommand{\cov}{\operatorname{cov}} % \newcommand{\non}{\operatorname{non}} % \newcommand{\cf}{\operatorname{cf}} % \newcommand{\add}{\operatorname{add}} % \newcommand{\End}{\operatorname{End}} % % \renewcommand{\labelitemi}{$\circ$} % % \section{Introduction} % % The \pkg{amscd} package provides a \env{CD} environment that % emulates the commutative diagram capabilities of \amstex/ version % 2.x. This means that only simple rectangular diagrams are % supported, with no diagonal arrows or more exotic features. Many % users will be better served by one of the more powerful diagram % packages such as \pkg{diagram}, \pkg{xypic}, \pkg{xymatrix}, % \pkg{kuvio}, or \pkg{tikz-cd}. % % Example: % \begin{equation}\begin{CD} % S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\ % @VVV @VV{\End P}V\\ % (S\otimes T)/I @= (Z\otimes T)/J % \end{CD}\end{equation} % \begin{verbatim} % \begin{equation}\begin{CD} % S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\ % @VVV @VV{\End P}V\\ % (S\otimes T)/I @= (Z\otimes T)/J % \end{CD}\end{equation} % \end{verbatim} % (assuming \cn{End} is defined as an `operator name'. % % Another example: % % We will make liberal use of Cichon's Diagram \cite{fre:cichon}: % \begin{equation} % \begin{CD} % \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>> % \cf(\mathcal{L})\\ % @VVV @AAA @AAA @VVV\\ % \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>> % \non(\mathcal{L}) % \end{CD}\end{equation} % \begin{verbatim} % \begin{equation}\begin{CD} % \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>> % \cf(\mathcal{L})\\ % @VVV @AAA @AAA @VVV\\ % \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>> % \non(\mathcal{L}) % \end{CD}\end{equation} % \end{verbatim} % % \section{\color[RGB]{255,0,0}Enhancements in amscdx} % We implemented double ("fat") and dashed arrows in both directions, % and color attributes for arrows and their annotations. % Naming scheme: % \begin{itemize} % \item The left-right double arrow \verb+@ZZZ+ % \item The up-down double arrow \verb+@XXX+. % \end{itemize} % % The color, a defined \verb+xcolor+ color name, can be added to an arrow by % inserting \verb+\CDlor{<+\textit{color}\verb+>}+ into the diagram before, i.e., % to the immediate left of, the arrow that you wish to color. The command % affects all arrows following it, so cancel it by the command % \verb+\CDlor{black}+. If you want to change the color of all the arrows, you % can place the color command outside and before the \verb+CD+ environment. % % Double arrows are obtained by inserting \verb+\CDfattrue+ into the diagram % before, i.e., to the immediate left of, the arrow that you wish to be % doubled. The command only affects the arrow immediately following it. To % change the whole diagram to double arrows, place the \verb+\CDfattrue+ command % outside and before the \verb+CD+ environment. If you do that, you can exempt % individual arrows, i.e., make them single again, by the command % \verb+\CDfatfalse+. % % A similar technique applies for obtaining dashed arrows, but with the % boolean (flag) \verb+\CDash+, i.e., the command \verb+\CDashtrue+ will give % a dashed arrow, while \verb+\CDashfalse+ will turn it off. \verb+\CDash+ % will only work if the state of the \verb+\CDfat+ flag be false. If both % \verb+\CDfat+ and \verb+\CDash+ are true, the \verb+CDfat+ flag takes % precedence. % % \subsection*{Dependencies} % % \begin{itemize} % \item the \verb+xcolor+ package, for the color; % \item the \verb+graphics+ package, if you want vertical dashed arrows, % as this uses the \verb+\rotatebox+ command. % \end{itemize} % These are now required within the package. % % \subsection*{Option} % The package takes one option: \verb+lyx+, to be issued if you use it % in LyX. Place, in the preamble, the command \verb+\usepackage[lyx]{amscdx}+. % This forces a \verb+\renewenvironment{CD}+ to be called instead of % \verb+\newenvironment{CD}+, as \verb+CD+ is already defined. % % A demonstration of some of the new capabilities (yes, this looks tacky): % \begin{equation} % \CDfattrue % \CDlor{green} % \begin{CD} % \text{Left header} @. \text{Right header} \\ % TL \CDfatfalse\CDashtrue @Z\text{Atop}Z{\hspace{4cm}}Z TR \\ % \CDfatfalse @X\text{Left}X{N_x}X % \CDfatfalse \CDashtrue % \CDlor{brown} @A{\scriptsize\begin{array}{r}\text{Right}\\ % \text{column}\end{array}}A{N^x}A \\ % ML \CDfatfalse \CDashtrue \CDlor{lime} @<{xyzxyzxyz}<{pqr}< MR \\ % \CDlor{red} @A{M^2}A\scriptsize\begin{array}{l}\text{Left}\\ % \text{column}\end{array}A @V+V{N_y}V \\ % BL \CDlor{purple} @Z\text{above}Z\text{below}Z BR \\ % \end{CD} % \end{equation} % \begin{verbatim} % \begin{equation} % \CDfattrue % \CDlor{green} % \begin{CD} % \text{Left header} @. \text{Right header} \\ % TL \CDfatfalse\CDashtrue @Z\text{Atop}Z{\hspace{4cm}}Z TR \\ % \CDfatfalse @X\text{Left}X{N_x}X % \CDfatfalse \CDashtrue % \CDlor{brown} @A{\scriptsize\begin{array}{r}\text{Right}\\ % \text{column}\end{array}}A{N^x}A \\ % ML \CDfatfalse \CDashtrue \CDlor{lime} @<{xyzxyzxyz}<{pqr}< MR \\ % \CDlor{red} @A{M^2}A\scriptsize\begin{array}{l}\text{Left}\\ % \text{column}\end{array}A @V+V{N_y}V \\ % BL \CDlor{purple} @Z\text{above}Z\text{below}Z BR \\ % \end{CD} % \end{equation} % \end{verbatim} % \hrule % \bigskip % % \StopEventually{} % % Standard package info. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) [1994/12/01]% LaTeX date must December 1994 or later \ProvidesPackage{amscdx}[2019/07/02 v2.2x AMS Commutative Diagrams] % \end{macrocode} % \begin{macrocode} \newif\iflyx\lyxfalse \DeclareOption{lyx}{\lyxtrue} \DeclareOption*{} \ProcessOptions*\relax \RequirePackage{amsgen} \RequirePackage{xcolor} \RequirePackage{graphicx} % \end{macrocode} % Better not to redefine \verb|\math@cr| if it is already defined, % because for CD use only we want to omit the part of the code % related to \verb|\dspbrk@lvl| (see \fn{amsmath.sty}). % % [mjd,1999/11/04] These definitions have gone somewhat obsolete; but % we had probably better leave them as they are for backward % compatibility. % \begin{macrocode} \@ifundefined{math@cr}{% \def\math@cr{{\ifnum0=`}\fi \@ifstar{\global\@eqpen\@M\math@cr@}% {\global\@eqpen\interdisplaylinepenalty \math@cr@}} % \end{macrocode} % The following section merely duplicates some code from the % \pkg{amsmath} package, in case the \pkg{amscdx} package is used by % itself. For documentation of the code refer to \fn{amsmath.dtx}. % \begin{macrocode} \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} \def\math@cr@@[#1]{\ifnum0=`{\fi}\math@cr@@@ \noalign{\vskip#1\relax}} \def\restore@math@cr{\def\math@cr@@@{\cr}} }{} \restore@math@cr % \end{macrocode} % [mjd,1999/11/04] These definitions too are somewhat obsolete; % but we had probably better leave them as they are for backward % compatibility. % \begin{macrocode} % \def\clap#1{\hbox to 0pt{\hss#1\hss}} % \newif\ifCDfat \newif\ifCDash \def\dye@{black} \def\CDlor#1{\gdef\dye@{#1}} % must be gdef % % \@ifundefined{rightarrowfill@}{ \def\rightarrowfill@#1{% \m@th\setboxz@h{$#1\relbar$}\ht\z@\z@ $#1\copy\z@\mkern-6mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-6mu\mathord\rightarrow$} \def\leftarrowfill@#1{% \m@th\setboxz@h{$#1\relbar$}\ht\z@\z@ $#1\mathord\leftarrow\mkern-6mu\cleaders% \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill \mkern-6mu\box\z@$} \def\leftrightarrowfill@#1{% \m@th\setboxz@h{$#1\relbar$}\ht\z@\z@ $#1\mathord\leftarrow\mkern-6mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-6mu\mathord\rightarrow$} }{} % \end{macrocode} % % Added double arrows % % \begin{macrocode} \def\Rightarrowfill@#1{% \m@th\setboxz@h{$#1\Relbar$}\ht\z@\z@ $#1\copy\z@\mkern-6mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-6mu\mathord\Rightarrow$} \def\Leftarrowfill@#1{% \m@th\setboxz@h{$#1\Relbar$}\ht\z@\z@ $#1\mathord\Leftarrow\mkern-6mu\cleaders% \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill \mkern-6mu\box\z@$} \def\Leftrightarrowfill@#1{% \m@th\setboxz@h{$#1\Relbar$}\ht\z@\z@ $#1\mathord\Leftarrow\mkern-6mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-6mu\mathord\Rightarrow$} % \def\rightdasharrowfill@#1{% \m@th\setboxz@h{$#1\:\relbar\:$}\ht\z@\z@ $#1\copy\z@\mkern-6mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-2mu\mathord\rightarrow$} \def\leftdasharrowfill@#1{% \m@th\setboxz@h{$#1\:\relbar\:$}\ht\z@\z@ $#1\mathord\leftarrow\mkern-2mu\cleaders% \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill \mkern-6mu\box\z@$} \def\leftrightdasharrowfill@#1{% \m@th\setboxz@h{$#1\:\relbar\:$}\ht\z@\z@ $#1\mathord\leftarrow\mkern-2mu\cleaders \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill \mkern-2mu\mathord\rightarrow$} % \end{macrocode} % % \begin{macrocode} \def\atdef@#1{\expandafter\def\csname\space @\string#1\endcsname} \@ifundefined{Iat}{% \DeclareRobustCommand{\Iat}{\FN@\at@} }{} \begingroup \catcode`\@=\active % \end{macrocode} % Define math \qc{\@} to replicate its mathcode-dictated behavior. % This is in case \qc{\@} occurs outside of \env{CD}. % \begin{macrocode} \csname if\string @compatibility\endcsname \else \fam=\mathcode`\@ \xdef @{\mathchar\number\fam\space } \fi \gdef\CDat{\let @=\Iat} \endgroup \mathcode`\@="8000 % make @ pseudo-active in math \def\at@{\let\next@\at@@ \ifcat\noexpand\next a\else \ifcat\noexpand\next0\else \ifcat\noexpand\next\relax\else \let\next@\at@@@\fi\fi\fi\next@} \def\at@@#1{\expandafter \ifx\csname\space @\string#1\endcsname\relax \DN@{\at@@@#1}% \else \DN@{\csname\space @\string#1\endcsname}% \fi\next@}% % \end{macrocode} % The following items should be defined only if they are not % already defined, either to leave the package name untouched (in % the case of \cs{PackageError}) or to avoid redundant allocation % of token or dimen registers. % \begin{macrocode} \@ifundefined{default@tag}{% \def\default@tag{% \def\tag{\PackageError{amscdx}{\protect\tag\space not allowed here}\@eha}}% }{}% \@ifundefined{at@@@}{% \def\at@@@{\PackageError{amscdx}{\Invalid@@ @}{\the\athelp@}\char64\relax} }{} \@ifundefined{athelp@}{\csname newhelp\endcsname\athelp@ {Only certain combinations beginning with @ make sense to me.^^J% I'll assume you wanted @@ for a printed @.}}{} \@ifundefined{minaw@}{\newdimen\minaw@}{} \@ifundefined{bigaw@}{\newdimen\bigaw@}{} % \end{macrocode} % % Assignment of a couple of dimensions, and initialization of % \verb=\ampersand@=. We check to see if we need to define % \verb=\minaw@= and \verb=\bigaw@=. % \begin{macrocode} \minaw@11.111pt \newdimen\minCDarrowwidth \minCDarrowwidth2.5pc \newif\ifCD@ \let\ampersand@\relax % \end{macrocode} % % Added \verb|\restore@math@cr\default@tag| to fix line numbering % problems, 7-JUN-1991. Suggested by I.~Zakharevich. % \begin{macrocode} \iflyx\else\newenvironment{CD}{}{}\fi \renewenvironment{CD}{% \CDat \bgroup\relax\iffalse{\fi\let\ampersand@&\iffalse}\fi \CD@true\vcenter\bgroup\let\\\math@cr\restore@math@cr\default@tag \tabskip\z@skip\baselineskip20\ex@ \lineskip3\ex@\lineskiplimit3\ex@\halign\bgroup &\hfill$\m@th##$\hfill\crcr }{% \crcr\egroup\egroup\egroup } % \end{macrocode} % % \begin{macro}{\CD@check} % This check is used by all macros that must not appear outside the % \env{CD} environment. The first argument is the symbol to be used % after \verb+@+, the second one the action to be performed. % % Once again we use the trick of defining a temporary control % sequence \verb+\next@+ and calling it after the final \verb+\fi+. % This is not absolutely necessary, but it ensures that the % conditional text is processed in one and the same column % of the enclosing alignment. % \begin{macrocode} \def\CD@check#1#2{\ifCD@\DN@{#2}\else \DN@{\PackageError{amscdx}{@\protect#1 not allowed outside of the CD environment}\@eha}% \fi\next@} % \end{macrocode} % \end{macro} % % The boolean \verb+\ifCDfat+ has scope only within a table cell: % % \begin{macrocode} \atdef@>#1>#2>{% \ifCDfat\gdef\ar@{\Rightarrowfill@}\else\ifCDash\gdef\ar@{\rightdasharrowfill@}\else\gdef\ar@{\rightarrowfill@}\fi\fi \gdef\before@{\dye@} \ampersand@ \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi \setboxz@h{$\m@th\scriptstyle\;{#1}\;\;$}% \ifdim\wdz@>\bigaw@\global\bigaw@\wdz@\fi % \end{macrocode} % If \verb|#2| is empty we can save some work. % \begin{macrocode} \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;{#2}\;\;$}% \ifdim\wd\@ne>\bigaw@\global\bigaw@\wd\@ne\fi}% \ifCD@\enskip\fi \color{\before@}\mathrel{\mathop{\hbox to\bigaw@{\ar@\displaystyle}}% \limits^{#1}\@ifnotempty{#2}{_{#2}}}% \ifCD@\enskip\fi \ampersand@} % \atdef@<#1<#2<{% \ifCDfat\gdef\ar@{\Leftarrowfill@}\else\ifCDash\gdef\ar@{\leftdasharrowfill@}\else\gdef\ar@{\leftarrowfill@}\fi\fi \gdef\before@{\dye@} \ampersand@ \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi \setboxz@h{$\m@th\scriptstyle\;\;{#1}\;$}% \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;\;{#2}\;$}% \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}% \ifCD@\enskip\fi \color{\before@}\mathrel{\mathop{\hbox to\bigaw@{\ar@\displaystyle}}% \limits^{#1}\@ifnotempty{#2}{_{#2}}}% \ifCD@\enskip\fi \ampersand@} % \end{macrocode} % % \begin{macrocode} \atdef@ Z#1Z#2Z{\CD@check{x..x..x}{% \ifCDfat\gdef\ar@{\Leftrightarrowfill@}\else\ifCDash\gdef\ar@{\leftrightdasharrowfill@}\else\gdef\ar@{\leftrightarrowfill@}\fi\fi \gdef\before@{\dye@} \ampersand@ \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi \setboxz@h{$\m@th\scriptstyle\;\;{#1}\;$}% \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;\;{#2}\;$}% \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}% \ifCD@\enskip\fi \color{\before@}\mathrel{\mathop{\hbox to\bigaw@{\ar@\displaystyle}}% \limits^{#1}\@ifnotempty{#2}{_{#2}}}% \ifCD@\enskip\fi \ampersand@}} % \end{macrocode} % % Variants of the above two arrows, using \verb|(| and \verb|)| % characters instead of \verb|<| and \verb|>| characters, are % provided for those whose keyboards don't have the latter. % \begin{macrocode} \begingroup \catcode`\~=\active \lccode`\~=`\@ \lowercase{% \global\atdef@)#1)#2){~>#1>#2>} \global\atdef@(#1(#2({~<#1<#2<} }% end lowercase \endgroup % \end{macrocode} % % \begin{macrocode} \atdef@ A#1A#2A{\CD@check{A..A..A}{\color{\dye@}\llap{$\m@th\vcenter{\hbox {$\scriptstyle#1$}}$} \ifCDfat \Big\Uparrow \else \ifCDash \vphantom{\Bigg\Updownarrow}\text{\rotatebox{90}{\clap{$\mkern8mu\relbar\:\relbar\mkern-2mu\rightarrow$}}} \else \Big\uparrow \fi \fi \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}} % \atdef@ V#1V#2V{\CD@check{V..V..V}{\color{\dye@}\llap{$\m@th\vcenter{\hbox {$\scriptstyle#1$}}$} \ifCDfat \Big\Downarrow \else \ifCDash \vphantom{\Bigg\Updownarrow}\text{\rotatebox{270}{\clap{$\mkern-8mu\relbar\:-\mkern-2mu\rightarrow$}}} \else \Big\downarrow \fi \fi \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}} % \atdef@ X#1X#2X{\CD@check{X..X..X}{\color{\dye@}\llap{$\m@th\vcenter{\hbox {$\scriptstyle#1$}}$} \ifCDfat \Big\Updownarrow \else \ifCDash \vphantom{\Bigg\Updownarrow}\text{\rotatebox{90}{\clap{$\mkern8mu\leftarrow\mkern-2mu\relbar\mkern-2mu\rightarrow$}}} \else \Big\updownarrow \fi \fi \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}} % \atdef@={\CD@check={\gdef\before@{\dye@}&\color{\before@}\enskip\mathrel {\vbox{\hrule\@width\minCDarrowwidth\vskip2\ex@\hrule\@width \minCDarrowwidth}}\enskip&}} % \atdef@|{\CD@check|{\color{\dye@}\Big\Vert&&}} % \atdef@\vert{\CD@check\vert{\color{\dye@}\Big\Vert&&}} % \atdef@.{\CD@check.{&&}} % \end{macrocode} % % The \cn{pretend} command has weird syntax that doesn't fit well % with standard \latex/ syntax so we leave it undone, at least for % now. [mjd,1994/10/27] % \begin{macrocode} %\def\pretend#1\haswidth#2{\setboxz@h{$\m@th\scriptstyle{#2}$}\hbox % to\wdz@{\hfill$\m@th\scriptstyle{#1}$\hfill}} % \end{macrocode} % % The usual \cs{endinput} to ensure that random garbage at the end of % the file doesn't get copied by \fn{docstrip}. % \begin{macrocode} \endinput % \end{macrocode} % % \CheckSum{829} % \Finale