正确声明一个新符号

正确声明一个新符号

如果我有这个 MWE:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz-cd,tikz}
\usetikzlibrary{decorations.pathmorphing}

\DeclareRobustCommand{\twoheads}{\mathbin{\begin{tikzcd}[column sep=1.2em]{\mkern-10mu}\arrow[r,two heads,squiggly]&{\mkern-10mu}\end{tikzcd}}}
\begin{document}
$A\twoheads B$, $a {\scriptstyle \twoheads} v$, $l {\scriptscriptstyle \twoheads} g$
\end{document}

并且我想\twoheads使用\mathbin、或\mathrel或其他命令(\mathclap等)创建一个名为的新符号,为什么会出现这个错误?

未定义控制序列。[$A\twoheads]

我忘记了什么?最佳解决方案是什么?

跟进或编辑:查看非常好的用户@campa 的链接,我尝试使用出色用户@David Carlisle 的答案\newcommand 和 tikzcd

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz-cd,tikz}
\usetikzlibrary{decorations.pathmorphing}

\newcommand{\dotheobvious}[1]{#1}
\dotheobvious{\[\mathbin{\begin{tikzcd}[column sep=1.2em,ampersand replacement=\&]{\mkern-10mu}\arrow[r,two heads,squiggly]&{\mkern-10mu}\end{tikzcd}}\]}

\begin{document}
$A\dotheobvious{B}$
\end{document}

1.我不明白为什么要这么做[1]{#1}

2.我明白了ampersand replacement=\&;

3.如果我已经放了\DeclareMathCommand为什么\DeclareRobustCommand我必须添加\[...\]考虑tikz-cd,特别是在文本模式和数学模式下工作?

4.最后的密码不起作用。

追加:2021/07/13:我按照@egreg的建议做了,但还是没有找到正确的解决方案。这是带有错误的MWE:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz-cd,tikz}
\usetikzlibrary{decorations.pathmorphing}

\newcommand{\squee}[1]{#1}
\squee{\mathbin{\begin{tikzcd}[column sep=1.2em,ampersand replacement=\&]{\mkern-10mu}\arrow[r,two heads,squiggly]\&{\mkern-10mu}\end{tikzcd}}}

\begin{document}
$A\squee B$
\end{document}

答案1

我不太确定在经过大量编辑后如何回答,所以我尝试一步一步地进行......为了简洁起见,我假设以下所有代码片段都以代码开头

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz-cd,tikz}
\usetikzlibrary{decorations.pathmorphing}

最初的问题

\DeclareRobustCommand{\twoheads}{%
   \mathbin{%
      \begin{tikzcd}[column sep=1.2em]
      {\mkern-10mu}\arrow[r,two heads,squiggly]&{\mkern-10mu}
      \end{tikzcd}%
   }%
}
\begin{document}
$A\twoheads B$
\end{document}

失败,原因解释如下\newcommand 和 tikzcdtikzcd更改 catcodes,如果将代码放入宏中,则它将不起作用,因为 catcodes 已被冻结。


然后你尝试 David 的代码并写入

\newcommand{\dotheobvious}[1]{#1}
\dotheobvious{\[\mathbin{\begin{tikzcd}[column sep=1.2em,ampersand replacement=\&]{\mkern-10mu}\arrow[r,two heads,squiggly]&{\mkern-10mu}\end{tikzcd}}\]}
\begin{document}
$A\dotheobvious{B}$
\end{document}

但我认为你误解了他的观点:宏\dotheobvious只是使用它的参数,但 David 的观点是使用它并传递tikzcdas 宏参数会冻结 catcodes,从而导致错误。然而,他把代码里面,而document您尝试在序言中执行此操作。当然,您会遇到错误,因为您尝试在序言中排版。

$A\dotheobvious{B}$完全一样$AB$


您的第三段代码也存在同样的问题。您已经删除了 and \[\]但仍试图在序言中进行排版,这将导致错误。


长话短说:你想要

\documentclass[twocolumn]{article}
\usepackage{amsmath}
\usepackage{tikz-cd,tikz}
\usetikzlibrary{decorations.pathmorphing}

\DeclareRobustCommand{\squee}{%
   \mathbin{%
      \begin{tikzcd}[column sep=1.2em,ampersand replacement=\&]
      {\mkern-10mu}\arrow[r,two heads,squiggly]\&{\mkern-10mu}
      \end{tikzcd}%
   }%
}

\begin{document}
Inline math $A\squee B$, or
\begin{align*}
A \squee B
\end{align*}
in display math.
\end{document}

在此处输入图片描述

相关内容