带有 Mathcal 的旋转门:缺少 \endcsname 插入

带有 Mathcal 的旋转门:缺少 \endcsname 插入

我使用turnstile软件包和xparse软件包来高效使用turnstile。但有一次,我不断收到错误消息,我发现这\not{\sdtstile{\mathcal{S}}{}}就是罪魁祸首。

错误信息是

! Missing \endcsname inserted.
<to be read again> 
                   \protect 
l.17 But $\not{\sdtstile{\mathcal{S}}{}}
                                        $ causes error, Missing \endcsname i...

这是我的代码:

\documentclass[openany,english]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{newtxtext}
\usepackage[nonewtxmathopt]{newtxmath}  

\usepackage{amsmath, amssymb, graphicx}
\usepackage{turnstile}  
\usepackage{xparse}     
\usepackage{cancel}

\NewDocumentCommand{\st}{O{} O{}}{\text{\raisebox{0.1mm}{\scalebox{0.7}{$\ \,\sdtstile{#1}{#2}\,\,$}}}}
\NewDocumentCommand{\nst}{O{} O{}}{\text{\raisebox{0.1mm}{\scalebox{0.7}{$\ \,\not{\sdtstile{#1}{#2}}\,\,$}}}}
\NewDocumentCommand{\cst}{O{} O{}}{\text{\raisebox{0.1mm}{\scalebox{0.7}{$\ \,\cancel{\sdtstile{#1}{#2}}\,\,$}}}}

\begin{document}

\[\Sigma\st[\mathcal{S}]\alpha\quad \Sigma\nst[S]\alpha\quad \Sigma\cst[\mathcal{S}]\alpha\]
%But $\not{\sdtstile{\mathcal{S}}{}}$ causes error, Missing \endcsname inserted

\end{document} 

在此处输入图片描述

问题是,\sdtstile{\mathcal{S}}{}虽然\not{\sdtstile{S}{}}有效,但是\not{\sdtstile{\mathcal{S}}{}}不起作用。我学会了这里我可以像示例中那样使用取消包,但我更喜欢小的“不”符号。在这里,xparse 似乎不相关,但我只是想提一下我想将它用作宏。此外,如果有人对宏中旋转门的形状/边距有更好的想法,我很乐意得到建议!

答案1

newtxmath包重新定义\not

1738 %%% \not redefined:
1739 %%%    \not= becomes \ne
1740 %%%    \not< becomes \nless
1741 %%%    \not> becomes \ngtr
1742 %%%    if \notXXX is defined, \not\XXX becomes \notXXX;
1743 %%%    if \nXXX is defined, \not\XXX becomes \nXXX;
1744 %%%    otherwise, \not\XXX is done in the usual way.
1745 \DeclareMathSymbol{\n@tch@r}{\mathrel}{symbols}{54}
1746 
1747 \DeclareRobustCommand*{\not}[1]{%
1748    \ifx #1=\ne\else
1749    \ifx #1<\nless\else
1750    \ifx #1>\ngtr\else
1751    \n@t@@n{#1}\fi\fi\fi}
1752 
1753 \def\n@t@@n#1{%
1754   \begingroup \escapechar\m@ne\xdef\@gtempa{not\string#1}\endgroup%
1755   \expandafter\@ifundefined{\@gtempa}%
1756      {\not@n@{#1}}%
1757      {\@nameuse{\@gtempa}}}
1758 \def\not@n@#1{%
1759   \begingroup \escapechar\m@ne\xdef\@gtempa{n\string#1}\endgroup%
1760   \expandafter\@ifundefined{\@gtempa}%
1761      {\n@tch@r #1}%
1762      {\@nameuse{\@gtempa}}}

尤其是,我们可以看到接下来发生的事情\not 必须是一个单一的标记。随着你的呼唤

\not{\sdtstile{\mathcal{S}}{}}

所有条件都被评估为假,因为\sdtstile与 不同{;所以\n@t@@n{#1}剩下的也是;但此时,TeX 想要做

\xdef\@gtempa{not\string\sdtstile{\mathcal{S}}{}}

问题就出在这里,因为\mathcal无法进入受 约束的替换文本\xdef\expandafter注释中提出的 会发生什么? 的参数\not\expandafter,因此\xdef不会失败,并将 的替换文本变成\@gtempanotexpandafter由于未定义,第 1760 行的测试遵循 true 分支,因此使用\notexpandafter标准(现在称为 \n@tch@r`)。\not

顺便说一句,\expandafter1755 行和 1760 行完全没用。

\nst示例中的调用没有\mathcal,这就是它不产生错误的原因。如果您尝试\nst[\mathcal{S}],您将看到相同的错误。

解决方案?使用不同的定义:

\makeatletter
\NewDocumentCommand{\nst}{O{} O{}}{%
  \text{\raisebox{0.1mm}{\scalebox{0.7}{$\ \,\n@tch@r\mathrel{\sdtstile{#1}{#2}}\,\,$}}}%
}
\makeatother

在此处输入图片描述

当然,这是针对特定的newtxmath;我看不到“通用”的解决方法。

答案2

这只在显示和文本样式中有效(我无法\sdtstile使用数学样式进行缩放),但涉及在空白栏杆下堆叠所需的参数。

\documentclass[openany,english]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{newtxtext}
\usepackage[nonewtxmathopt]{newtxmath}  

\usepackage{amsmath, amssymb, graphicx}
\usepackage{turnstile}  
\usepackage{stackengine}

\newcommand{\Nst}[1][]{\mathrel{\raisebox{0.1mm}{%
  \scalebox{0.7}{\stackunder[-3pt]{$\not{\sdtstile{}{}}$}{$\scriptstyle#1$}}}}}

\begin{document}
\[\Sigma\Nst[\mathcal{S}]\alpha\]
\end{document} 

在此处输入图片描述

相关内容