% \iffalse meta-comment % %% Copyright (C) 2018 by Marcel Krueger %% %% This file 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.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. % %<*batch> %<*gobble> \ifx\jobname\relax\let\documentclass\undefined\fi \ifx\documentclass\undefined \csname fi\endcsname % \input l3docstrip.tex \keepsilent \preamble \endpreamble \generate{\file{aligned-overset.sty}{\from{aligned-overset.dtx}{package}}} \endbatchfile % %<*gobble> \fi \expandafter\ifx\csname @currname\endcsname\empty \csname fi\endcsname % %<*driver> \documentclass[full]{l3doc} \usepackage{aligned-overset} \begin{document} \DocInput{aligned-overset.dtx} \PrintIndex \PrintChanges \end{document} % %<*gobble> \fi % % \fi % % \GetFileInfo{aligned-overset.dtx} % \title{The \pkg{aligned-overset} package\thanks{This document % corresponds to \pkg{aligned-overset}~0.1.0, dated~2018/04/04.}} % \author{Marcel Kr\"uger \\ \href{mailto:tex@2krueger.de}{tex@2krueger.de}} % % \maketitle % % \begin{documentation} % This package allows the base character of \cmd\underset{} or \cmd\overset{} to be used as the alignment position for the amsmath aligned math environments. % % \section{Example} % The naive way to align at an operator annotated by \cmd\overset{} would be % \begin{verbatim} % \begin{align*} % f(x)&\overset{\text{Def}}=x+x\\ % & =2x % \end{align*} % \end{verbatim} % This results in % \begin{align*} % f(x)&\overset{\text{Def}}=x+x\\ % & =2x % \end{align*} % But here, the two equal signes are not aligned. % % Using this package, this can be fixed by writing % \begin{verbatim} % \begin{align*} % f(x)\overset{\text{Def}}&=x+x\\ % &=2x % \end{align*} % \end{verbatim} % which result in correct alignment: % \begin{align*} % f(x)\overset{\text{Def}}&=x+x\\ % &=2x % \end{align*} % \section{Usage} % \begin{function}{\overset,\underset} % To add an alignment point at an \cmd\overset{} or \cmd\underset, add a |&| before the base symbol. % The |&| should not be enclosed in braces, even if the symbols are enclosed in braces. % For example you have to write |\overset{\approx}&{\ge}| instead of |\overset{\approx}{&\ge}|. % \end{function} % \end{documentation} % \begin{implementation} % \section{The implementation} % \begin{macrocode} %<@@=alignedsets> % \end{macrocode} % \iffalse %<*package> \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} \ProvidesExplPackage {aligned-overset} {2018/04/04} {0.1.0} {aligned overset and underset} \RequirePackage{xparse,amsmath,mathtools} % % \fi % \begin{macrocode} \box_new:N\l__alignedsets_clap_box \box_new:N\l__alignedsets_full_box % \end{macrocode} % \begin{macro}{\overset} % \begin{macrocode} \let\__alignedsets_original_overset:nn\overset \cs_set:Npn\overset{ \group_align_safe_begin: \__alignedsets_modified_overset:nwn } \NewExpandableDocumentCommand\__alignedsets_modified_overset:nwn{mt{&}m}{ \group_align_safe_end: \IfBooleanTF{#2}{ \group_begin: \hbox_set:Nn\l__alignedsets_clap_box{ $ \displaystyle {}\__alignedsets_original_overset:nn{\mathclap{#1}}{#3}{} $ } \hbox_set:Nn\l__alignedsets_full_box{ $ \displaystyle {}\__alignedsets_original_overset:nn{#1}{#3}{} $ } \hspace{ \dim_eval:n{(\box_wd:N\l__alignedsets_full_box-\box_wd:N\l__alignedsets_clap_box)/2} } \exp_args:NNNx \group_end: {&} \hspace{ -\dim_eval:n{ (\box_wd:N\l__alignedsets_full_box-\box_wd:N\l__alignedsets_clap_box)/2 } } \__alignedsets_original_overset:nn{#1}{#3} }{ \__alignedsets_original_overset:nn{#1}{#3} } } % \end{macrocode} % \end{macro} % \begin{macro}{\underset} % \begin{macrocode} \let\__alignedsets_original_underset:nn\underset \cs_set:Npn\underset{ \group_align_safe_begin: \__alignedsets_modified_underset:nwn } \NewExpandableDocumentCommand\__alignedsets_modified_underset:nwn{mt{&}m}{ \group_align_safe_end: \IfBooleanTF{#2}{ \group_begin: \hbox_set:Nn\l__alignedsets_clap_box{ $ \displaystyle {}\__alignedsets_original_underset:nn{\mathclap{#1}}{#3}{} \m@th $ } \hbox_set:Nn\l__alignedsets_full_box{ $ \displaystyle {}\__alignedsets_original_underset:nn{#1}{#3}{} \m@th $ } \hspace{ \dim_eval:n{(\box_wd:N\l__alignedsets_full_box-\box_wd:N\l__alignedsets_clap_box)/2} } \exp_args:NNNx \group_end: {&} \hspace{ -\dim_eval:n{ (\box_wd:N\l__alignedsets_full_box-\box_wd:N\l__alignedsets_clap_box)/2 } } \__alignedsets_original_underset:nn{#1}{#3} }{ \__alignedsets_original_underset:nn{#1}{#3} } } % \end{macrocode} % \end{macro} % \end{implementation}