我有以下 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}