
Ich versuche zu messen,natürliche Breitevon einem align*
(mit der fleqn
Option documentclass) und wurden in den Kommentaren unter
Bestimmen Sie die natürliche Breite von align*: varwidth verwendet \linewidth, obwohl die Anzeige korrekt istdas \intertext
nutzt die gesamte \linewidth
. Also, LösungGeräuscheeinfach, neu definieren \intertext
(und \shortintertext
und separat messen über \varwidth
).
Das Problem ist, dass es schwierig erscheint, diese beiden Makros neu zu definieren, da die Verwendung von \let
ignoriert zu werden scheint. Das MWE soll die letzten beiden Testfälle ansprechen, indem die Breite von \intertext
und \shorintertext
getrennt vom Rest von gemessen wird align*
.
Verweise:
- Bestimmen Sie die natürliche Breite von align*: varwidth verwendet \linewidth, obwohl die Anzeige korrekt ist
- align* in varwidth scheint die fleqn-Option zu ignorieren
- Dies ist eine verwandte Frage, aber die Antwort beinhaltete keine Neudefinition
\intertext
:Das Anwenden der Bedingung um \intertext und \shortintertext lässt übermäßigen vertikalen Raum übrig.
Code:
\documentclass[fleqn]{article}
\usepackage{etoolbox}
\usepackage{mathtools}
\usepackage{varwidth}
\usepackage{printlen}
\uselengthunit{mm}
\makeatletter
%% Fix for varwidth to work with fleqn option
%% https://tex.stackexchange.com/questions/394778/align-in-varwidth-seems-to-ignore-fleqn-option
\let\@vwid@eqmodetrue\@vwid@eqmodefalse
\newsavebox{\@IntertextSavebox}
\newlength{\@MaxIntertextWidth}
\newcommand{\MeasureIntertext}[1]{%
\savebox{\@IntertextSavebox}{%
\begin{varwidth}{\linewidth}
#1%
\end{varwidth}%
}%
%% Keep track of the maximum width of any \shorintertext and
%% \intertext within this align* environment.
\ifdim\wd\@IntertextSavebox>\@MaxIntertextWidth
\setlength{\@MaxIntertextWidth}{\wd\@IntertextSavebox}%
\fi
}%
\newsavebox{\@NonIntertextBox}
\newcommand{\GetNaturalVarwidth}[3]{%
%% #1 = length to contain the width
%% #2 = title for this test case
%% #3 = text to measure
\setlength{\@MaxIntertextWidth}{0pt}%
\savebox{\@NonIntertextBox}{%
\begin{varwidth}{\linewidth}
%% ------------------------------------------------------ Problem Area
%% This attempt to redefine these two seems to be ignored.
\let\shortintertext\MeasureIntertext
\let\intertext\MeasureIntertext
%% ------------------------------------------------------
#3%
\end{varwidth}%
}%
%% ------------------------------------------
%% For debugging purposes show the box.
\medskip\par
\noindent%
{\bfseries#2}%
\par\noindent
\fboxsep=0pt
\fbox{%
\usebox{\@NonIntertextBox}%
}%
\ifdim\wd\@IntertextSavebox>\wd\@NonIntertextBox
\setlength{#1}{\wd\@IntertextSavebox}%
\else
\setlength{#1}{\wd\@NonIntertextBox}%
\fi
{\par\tiny Natural Width is \printlength{#1}.}%
}%
\makeatother
\newlength{\NaturalWidth}
\begin{document}
\GetNaturalVarwidth{\NaturalWidth}{Small text}{Small text}% Works
%% These two don't work, but right now am just focusing on align*
%\GetNaturalVarwidth{\NaturalWidth}{Single Display Equation}{%
%\[
% F = ma.
%\]
%}
%
%\GetNaturalVarwidth{\NaturalWidth}{Single display equation with text}{%
%Single display equation
%\[
% F = ma.
%\]
%and some more text.%
%}
\GetNaturalVarwidth{\NaturalWidth}{Single align*}{%
\begin{align*}
F &= ma.
\end{align*}%
}
\GetNaturalVarwidth{\NaturalWidth}{Align* with text}{%
Famous Equations:
\begin{align*}
F &= ma. \\
E &= mc^2,
\end{align*}%
or at least they should be famous.
}
\GetNaturalVarwidth{\NaturalWidth}{Align* with shortintertext}{%
\begin{align*}
F &= ma. \\
\shortintertext{and}
E &= mc^2,
\end{align*}%
}
This one above should be 23.42914mm.
\GetNaturalVarwidth{\NaturalWidth}{Align* with intertext}{%
\begin{align*}
F &= ma. \\
\intertext{with some longer intertext}
E &= mc^2,
\end{align*}%
}
This one above should be greater than 23.42914mm
(which is width of just the nonintertext portion).
\end{document}
Listendateien
Ich erhalte eine Fehlermeldung
Undefined control sequence.
\shortintertext ...th }\normalbaselines \if_dim:w
beim Ausführen der bereitgestellten Antwort dachte ich, ich sollte die Ausgabe von \listfiles
: einschließen.
*File List*
article.cls 2014/09/29 v1.4h Standard LaTeX document class
fleqn.clo 2016/12/29 v1.2a Standard LaTeX option (flush left equations)
size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
etoolbox.sty 2018/02/11 v2.5e e-TeX tools for LaTeX (JAW)
mathtools.sty 2018/01/08 v1.21 mathematical typesetting tools
keyval.sty 2014/10/28 v1.15 key=value parser (DPC)
calc.sty 2014/10/28 v4.3 Infix arithmetic (KKT,FJ)
mhsetup.sty 2017/03/31 v1.3 programming setup (MH)
amsmath.sty 2017/09/02 v2.17a AMS math features
amstext.sty 2000/06/29 v2.01 AMS text
amsgen.sty 1999/11/30 v2.0 generic functions
amsbsy.sty 1999/11/29 v1.2d Bold Symbols
amsopn.sty 2016/03/08 v2.02 operator names
varwidth.sty 2009/03/30 ver 0.92; Variable-width minipages
printlen.sty 2009/09/03 v1.1a print lengths with units
graphicx.sty 2017/06/01 v1.1a Enhanced LaTeX Graphics (DPC,SPQR)
graphics.sty 2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR)
trig.sty 2016/01/03 v1.10 sin cos tan (DPC)
graphics.cfg 2016/06/04 v1.11 sample graphics configuration
pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
supp-pdf.mkii
epstopdf-base.sty 2016/05/15 v2.6 Base part for package epstopdf
infwarerr.sty 2016/05/16 v1.4 Providing info/warning/error messages (HO)
grfext.sty 2016/05/16 v1.2 Manage graphics extensions (HO)
kvdefinekeys.sty 2016/05/16 v1.4 Define keys (HO)
ltxcmds.sty 2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
kvoptions.sty 2016/05/16 v3.12 Key value format for package options (HO)
kvsetkeys.sty 2016/05/16 v1.17 Key value parser (HO)
etexcmds.sty 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
ifluatex.sty 2016/05/16 v1.4 Provides the ifluatex switch (HO)
pdftexcmds.sty 2018/01/21 v0.26 Utility functions of pdfTeX for LuaTeX (HO)
ifpdf.sty 2017/03/15 v3.2 Provides the ifpdf switch
epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live
***********
Antwort1
Das Paket amsmath
definiert \intertext
, dass eine Fehlermeldung ausgegeben wird, wenn es außerhalb bestimmter Umgebungen verwendet wird, in denen es unterstützt wird. Es wird in diesen Umgebungen \intertext@
definiert \intertext
. Daher \intertext@
muss es neu definiert werden.
\shortintertext
wird vom Paket bereitgestellt mathtools
und kann direkt neu definiert werden.
Der folgende Codeausschnitt ersetzt \vbox{...}
durch \begin{varwidth}{\linewidth}...\end{varwidth}
in \intertext
und \shortintertext
:
\def\intertext@measuring{% see \intertext@ in amsmath
\def\intertext##1{%
\ifvmode\else\\\@empty\fi
\noalign{%
\penalty\postdisplaypenalty\vskip\belowdisplayskip
%\vbox{
\begin{varwidth}{\linewidth}%
\normalbaselines
\ifdim\linewidth=\columnwidth
\else \parshape\@ne \@totalleftmargin \linewidth
\fi
\noindent##1\par
%}%
\end{varwidth}%
\penalty\predisplaypenalty\vskip\abovedisplayskip%
}%
}%
}
\MHInternalSyntaxOn
\def\shortintertext@measuring#1{% see \MT_shortintertext:n in mathtools
\ifvmode\else\\\@empty\fi
\noalign{%
\penalty\postdisplaypenalty\vskip\abovedisplayshortskip
\vskip-\lineskiplimit
\vskip\normallineskiplimit
\vskip\l_MT_above_shortintertext_sep
%\vbox{%
\begin{varwidth}{\linewidth}%
\normalbaselines
\if_dim:w
\if_dim:w \@totalleftmargin=\z@
\linewidth
\else:
-\maxdimen
\fi:
=\columnwidth
\else:
\parshape\@ne \@totalleftmargin \linewidth
\fi:
\noindent#1\par
%}%
\end{varwidth}%
\penalty\predisplaypenalty\vskip\abovedisplayshortskip%
\vskip-\lineskiplimit
\vskip\normallineskiplimit
\vskip\l_MT_below_shortintertext_sep
}%
}
\MHInternalSyntaxOff
Dann die Neudefinitionsbefehle:
\let\shortintertext\shortintertext@measuring
\let\intertext@\intertext@measuring
Die Messung des Beispiels wurde verbessert:
Vollständiges Beispiel (nur das Beispiel aus der Frage mit dem hinzugefügten Code aus dieser Antwort):
\documentclass[fleqn]{article}
\usepackage{etoolbox}
\usepackage{mathtools}
\usepackage{varwidth}
\usepackage{printlen}
\uselengthunit{mm}
\makeatletter
\def\intertext@measuring{% see \intertext@ in amsmath
\def\intertext##1{%
\ifvmode\else\\\@empty\fi
\noalign{%
\penalty\postdisplaypenalty\vskip\belowdisplayskip
%\vbox{
\begin{varwidth}{\linewidth}%
\normalbaselines
\ifdim\linewidth=\columnwidth
\else \parshape\@ne \@totalleftmargin \linewidth
\fi
\noindent##1\par
%}%
\end{varwidth}%
\penalty\predisplaypenalty\vskip\abovedisplayskip%
}%
}%
}
\MHInternalSyntaxOn
\def\shortintertext@measuring#1{% see \MT_shortintertext:n in mathtools
\ifvmode\else\\\@empty\fi
\noalign{%
\penalty\postdisplaypenalty\vskip\abovedisplayshortskip
\vskip-\lineskiplimit
\vskip\normallineskiplimit
\vskip\l_MT_above_shortintertext_sep
%\vbox{%
\begin{varwidth}{\linewidth}%
\normalbaselines
\if_dim:w
\if_dim:w \@totalleftmargin=\z@
\linewidth
\else:
-\maxdimen
\fi:
=\columnwidth
\else:
\parshape\@ne \@totalleftmargin \linewidth
\fi:
\noindent#1\par
%}%
\end{varwidth}%
\penalty\predisplaypenalty\vskip\abovedisplayshortskip%
\vskip-\lineskiplimit
\vskip\normallineskiplimit
\vskip\l_MT_below_shortintertext_sep
}%
}
\MHInternalSyntaxOff
%% Fix for varwidth to work with fleqn option
%% https://tex.stackexchange.com/questions/394778/align-in-varwidth-seems-to-ignore-fleqn-option
\let\@vwid@eqmodetrue\@vwid@eqmodefalse
\newsavebox{\@IntertextSavebox}
\newlength{\@MaxIntertextWidth}
\newcommand{\MeasureIntertext}[1]{%
\savebox{\@IntertextSavebox}{%
\begin{varwidth}{\linewidth}
#1%
\end{varwidth}%
}%
%% Keep track of the maximum width of any \shorintertext and
%% \intertext within this align* environment.
\ifdim\wd\@IntertextSavebox>\@MaxIntertextWidth
\setlength{\@MaxIntertextWidth}{\wd\@IntertextSavebox}%
\fi
}%
\newsavebox{\@NonIntertextBox}
\newcommand{\GetNaturalVarwidth}[3]{%
%% #1 = length to contain the width
%% #2 = title for this test case
%% #3 = text to measure
\setlength{\@MaxIntertextWidth}{0pt}%
\savebox{\@NonIntertextBox}{%
\begin{varwidth}{\linewidth}
%% ------------------------------------------------------ Problem Area
%% This attempt to redefine these two seems to be ignored.
%\let\shortintertext\MeasureIntertext
\let\shortintertext\shortintertext@measuring
%\let\intertext\MeasureIntertext
\let\intertext@\intertext@measuring
%% ------------------------------------------------------
#3%
\end{varwidth}%
}%
%% ------------------------------------------
%% For debugging purposes show the box.
\medskip\par
\noindent%
{\bfseries#2}%
\par\noindent
\fboxsep=0pt
\fbox{%
\usebox{\@NonIntertextBox}%
}%
\ifdim\wd\@IntertextSavebox>\wd\@NonIntertextBox
\setlength{#1}{\wd\@IntertextSavebox}%
\else
\setlength{#1}{\wd\@NonIntertextBox}%
\fi
{\par\tiny Natural Width is \printlength{#1}.}%
}%
\makeatother
\newlength{\NaturalWidth}
\begin{document}
\GetNaturalVarwidth{\NaturalWidth}{Small text}{Small text}% Works
%% These two don't work, but right now am just focusing on align*
%\GetNaturalVarwidth{\NaturalWidth}{Single Display Equation}{%
%\[
% F = ma.
%\]
%}
%
%\GetNaturalVarwidth{\NaturalWidth}{Single display equation with text}{%
%Single display equation
%\[
% F = ma.
%\]
%and some more text.%
%}
\GetNaturalVarwidth{\NaturalWidth}{Single align*}{%
\begin{align*}
F &= ma.
\end{align*}%
}
\GetNaturalVarwidth{\NaturalWidth}{Align* with text}{%
Famous Equations:
\begin{align*}
F &= ma. \\
E &= mc^2,
\end{align*}%
or at least they should be famous.
}
\GetNaturalVarwidth{\NaturalWidth}{Align* with shortintertext}{%
\begin{align*}
F &= ma. \\
\shortintertext{and}
E &= mc^2,
\end{align*}%
}
This one above should be 23.42914mm.
\GetNaturalVarwidth{\NaturalWidth}{Align* with intertext}{%
\begin{align*}
F &= ma. \\
\intertext{with some longer intertext}
E &= mc^2,
\end{align*}%
}
This one above should be greater than 23.42914mm
(which is width of just the nonintertext portion).
\end{document}