\dots 加 \left

\dots 加 \left

我有以下 MNWE 但不明白为什么会失败。

\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\dots \left. \right.$
\end{document}

理解 中的相关代码amsmath相当困难,我找不到任何地方提到这样做是不可以的。当然,我可以使用一些更专业的点命令来摆脱猜测\dots。我将特别感激解释\uppercase所有辅助定义(\striplong@...)和使用\meaning中的技巧是什么\mdots

答案1

更新该问题已在版本 2.15d 中修复(已于今天(2016-06-28)发送至 ctan,因此几天后将会分发到各个发行版。)


这是一个错误(抱歉,请问@egreg 是谁做的:-),直到修复可用为止,您可以使用

 $\dots\relax \left. a \right.$

\striplong@您无需更改文档,只需按如下方式修复定义

\documentclass{article}
\usepackage{amsmath}
{\catcode`\@=11 \uccode`9=`\l \uccode`8=`\o %
 \uppercase{\gdef\striplong@#1#2#3#4\relax{%
  \ifx9#2\ifx8#3\@xp\@xp\@xp\@xp\@xp\@xp\@xp\zap@to@space\fi\fi}}}

\begin{document}
a$x$

$\dots \left. a \right)$
\end{document}

更新

还有其他情况可能会触发相同的错误(除了在测试文件中,这种情况发生的可能性较小),基本上任何以 开头的原语都是如此,l所以我认为这是一个更好的修复方法。它看起来很复杂,因为它正在修补一个较大的宏,但这里实际建议的更改是添加一个空格字符(. .........而不是..........

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\def\mdots@@{\gdef\thedots@{\dotso@}%
 \ifx\@let@token\boldsymbol 
   \gdef\thedots@\boldsymbol{\boldsymboldots@}%
 \else
   \ifx,\@let@token \gdef\thedots@{\dotsc}%
   \else
     \ifx\not\@let@token
       \gdef\thedots@{\dotsb@}%
     \else
       \keybin@
       \ifgtest@ % if \keybin@ test
         \gdef\thedots@{\dotsb@}%
       \else
%    \end{macrocode}
% The space below ensures that |\zap@to@space| never gets a runaway argument.
% (If |\meaning@| is |\left|, |\long|, |\looseness| in which case later tests will see |.|
% and choose |\ldots| as required.)
%    \begin{macrocode}
         \xdef\meaning@{\meaning\@let@token. .........}%
%    \end{macrocode}
% In previous versions \verb|\long| macros were not seen.
% Bad as this file uses \verb|\(re)newcommand| for \verb|\implies| etc.
%    \begin{macrocode}
         \xdef\meaning@@{\@xp\striplong@\meaning@\relax\meaning@}%
%    \end{macrocode}
%    \begin{macrocode}
         \@xp\math@\meaning@\math@
         \ifgtest@ % if \mathxxx test
           \@xp\mathch@\meaning@\mathch@
           \ifgtest@ % if \mathchar
             \@xp\getmathch@\meaning@\getmathch@
           \fi % end if \mathchar
         \else  % \not \mathxxx
%    \end{macrocode}
% Test for \verb|\Umathchar| added.
%    \begin{macrocode}
             \@xp\Umathch@\meaning@"0"\Umathch@
             \ifgtest@ % if \Umathchar
             \else % else not \Umathcar
%    \end{macrocode}
%    \begin{macrocode}
           \@xp\macro@\meaning@@\macro@
           \ifgtest@ % if macro test
             \@xp\not@\meaning@\not@
             \ifgtest@ % if macro starts \not test
               \gdef\thedots@{\dotsb@}%
             \else% else not \not
               \@xp\DOTS@\meaning@\DOTS@
               \ifgtest@ % \if DOTS
                 \ifcase\number\DOTSCASE@ %ifcase dots
                   \gdef\thedots@{\dotsb@}%
                 \or\gdef\thedots@{\dotsi}\else
                 \fi % endifcase dots
               \else % not macro starts \DOTS
                 \@xp\math@\meaning@\math@
                 \ifgtest@ % \if macro starts \mathxxxx
                   \@xp\mathbin@\meaning@\mathbin@
                   \ifgtest@ % if macro starts \mathbin
                     \gdef\thedots@{\dotsb@}%
                   \else % not macro starting \mathbin
                     \@xp\mathrel@\meaning@\mathrel@
                     \ifgtest@ % if macro starts \mathrel
                       \gdef\thedots@{\dotsb@}%
                     \fi % endif macro starts \mathrel (no else)
                   \fi % endif macro starts \mathbin
                 \fi % endif macro starts with \mathxxx (no else)
               \fi % endif macro starts \DOTS else
             \fi % end macro  starting \not \ifgtest@ test (no else)
%    \end{macrocode}
% Additional test for a catcode 12 character.
%    \begin{macrocode}
             \else
               \@xp\thecharacter@\meaning@\thecharacter@
%    \end{macrocode}
%    \begin{macrocode}
             \fi % end macro \ifgtest@ test (no else)
           \fi % end if \Umathchar test
         \fi % end \math@   \ifgtest@ 
       \fi % end \keybin@ \ifgtest@ test (no else)
     \fi % end if \not (no else)
   \fi % end if comma (no else)
 \fi % end if boldsymbol (no else)
 \thedots@}
\makeatother

\begin{document}
a$x$

$.\dots \left. a \right)$


$.\dots \long\def\zzz{} x$


$.\dots \looseness=1 x$

$.\dots \longrightarrow x$


$.\dots + x$


\end{document}

相关内容