我使用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
不会失败,并将 的替换文本变成\@gtempa
。notexpandafter
由于未定义,第 1760 行的测试遵循 true 分支,因此使用\notexpandafter
标准(现在称为 \n@tch@r`)。\not
顺便说一句,\expandafter
1755 行和 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}