我在使用 mathtools 包中的命令时遇到了问题\DeclarePairedDelimiter
,其中包含可选的 size 参数移动论点例如章节标题(或标题文本),当文档中还要生成目录(或图片列表)时。考虑以下带有分隔符的最小(非)工作示例\norm
:
\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{mathtools}
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}
\begin{document}
% \tableofcontents
\section{This works: $\norm{x}$}
\section{Also works: $\norm*{x}$}
\section{This fails: $\norm[\big]{x}$}
\end{document}
如果没有\tableofcontents
,所有三个部分都可以正常工作,文档也可以正确编译。但是,如果有\tableofcontents
,最后一节会导致编译失败:
Argument of \\MT_delim_norm_nostar: has an extra }.
Paragraph ended before \\MT_delim_norm_nostar: was complete.
Missing $ inserted.
有人知道如何正确使用\norm
带有特定([\big]
、[\Big]
等)大小参数的命令,以便在创建目录时编译不会失败吗?简单地\protect
直接在受影响的命令前面添加\norm
似乎没有帮助。
答案1
\big
当写成 时, and friends似乎被扩展了.toc
。我不确定是否可以强化\big
and friends。
正常情况下,人们会用\protect
它来帮助它。但随后,正常的处理\norm[\protect\big]{x}
失败了(似乎)。
这可能是因为\norm
想要将[...]
参数视为字符串,并且需要删除\
(以便将其转换为说\bigl
和\bigr
)。 大概\protect\big
会导致失败。
我发现一个解决方案是使用etoolbox
包然后\protecting
在整个包中使用\norm[\big]{x}
,这似乎有效。
\documentclass{scrartcl}
%\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools,etoolbox}
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}
\begin{document}
\tableofcontents
\section{This works: $\protect\big(x\protect\big)$}
\section{This works: $\norm{x}$}
\section{Also works: $\norm*{x}$}
\section{This works: $\protecting{\norm[\big]{x}}$}
\end{document}
答案2
您可以增强\big
(和其他类似的命令):
\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{etoolbox}
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}
\robustify\big
\begin{document}
\tableofcontents
\section{This works: $\norm{x}$}
\section{Also works: $\norm*{x}$}
\section{This works: $\norm[\big]{x}$}
$\norm[\big]{x}\norm{x}$
\end{document}
在不久的将来,amsmath
将进行修改,以使其和朋友更加强大。与此同时,您可以应用临时修复,如果文档在按所述修改\big
时进行排版,则该修复将不起作用。amsmath
\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{mathtools}
%%% this is just for checking against the future version
\iffalse
\makeatletter
\renewcommand{\big}{\bBigg@\@ne}
\renewcommand{\Big}{\bBigg@{1.5}}
\renewcommand{\bigg}{\bBigg@\tw@}
\renewcommand{\Bigg}{\bBigg@{2.5}}
\makeatother
\fi
%%% end
%%% temporary fix until amsmath does \DeclareRobustCommand{\big}{...}
%%% and friends
\begingroup
\makeatletter
\def\first#1#2\first{#1}
\expandafter\expandafter\expandafter\ifx\expandafter\first\big\first\bBigg@
% we need to robustify
\expandafter\@firstoftwo
\else
% \big is really robust
\expandafter\@secondoftwo
\fi
{\endgroup
\expandafter\DeclareRobustCommand\expandafter\big\expandafter{\big}%
\expandafter\DeclareRobustCommand\expandafter\Big\expandafter{\Big}%
\expandafter\DeclareRobustCommand\expandafter\bigg\expandafter{\bigg}%
\expandafter\DeclareRobustCommand\expandafter\Bigg\expandafter{\Bigg}%
}
{\endgroup}
%%% end of temporary fix
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}
\begin{document}
\ShowCommand\big
\tableofcontents
\section{This works: $\norm{x}$}
\section{Also works: $\norm*{x}$}
\section{This works: $\norm[\big]{x}$}
$\norm[\big]{x}\norm{x}$
\end{document}
\iffalse
从上到下的匹配部分\fi
只是为了模拟下一个amsmath
版本不是修复的一部分。通过更改\iffalse
为\iftrue
,您将获得该未来版本。我添加它是为了检查修复在这种情况下是否完全不执行任何操作。