如何使用 \DeclarePairedDelimiter 命令作为移动参数(例如部分或标题)?

如何使用 \DeclarePairedDelimiter 命令作为移动参数(例如部分或标题)?

我在使用 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。我不确定是否可以强化\bigand 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,您将获得该未来版本。我添加它是为了检查修复在这种情况下是否完全不执行任何操作。

相关内容