这个问题是我之前的一个问题的延续:在带星号和不带星号的 \chapter 命令前添加不同的内容。
在某些情况下,另一个带星号/不带星号的宏定义中的带星号的宏无法按预期工作。以下 MCE 工作正常,但是,一旦glossaries
加载包,星号\resetsecnumdepth
看起来就像断开了一样:它出现在文本中。
\documentclass{book}
\usepackage{xparse}
\usepackage{tocvsec2}
% \usepackage{glossaries}
%
\let\ORIchapter\chapter%
\RenewDocumentCommand\chapter{som}{%
\IfBooleanTF{#1}
{
\setsecnumdepth{none}%
}
{%
\resetsecnumdepth*
}
\IfNoValueTF{#2}
{\ORIchapter{#3}}
{\ORIchapter[#2]{#3}}%
}
%
\setsecnumdepth{chapter}
\begin{document}
\chapter{A chapter}
\end{document}
问题不是来自xparse
包,因为以下仅使用 LaTeX 宏的 MCE 也遇到了同样的问题。
\documentclass{book}
\usepackage{tocvsec2}
\usepackage{glossaries}
%
\let\ORIchapter\chapter%
\makeatletter%
\renewcommand\chapter{%
\@ifstar{\starred@chapter}{\unstarred@chapter}%
}
\newcommand{\starred@chapter}{%
\setsecnumdepth{none}%
\ORIchapter%
}%
\newcommand{\unstarred@chapter}{%
\resetsecnumdepth*
\ORIchapter%
}%
%
\makeatother%
%
\setsecnumdepth{chapter}
\begin{document}
\chapter{A chapter}
\end{document}
我看了一下glossaries
代码,并做了一些测试(修补所
glossaries
涉及的宏\chapter
以便它们使用\ORIchapter
),但我没有成功调试问题(文件中没有警告也没有错误.log
)。
答案1
这又是一个伪空间的情况!
\documentclass{book}
\usepackage{xparse}
\usepackage{tocvsec2}
\usepackage{glossaries}
\makeatletter
\renewcommand\resetsecnumdepth{%
\@ifstar{%
\setcounter{secnumdepth}{\value{max@secnumdepth}}%
\edef\stack@secnumdepth{\the\c@secnumdepth\relax}%
}{%
\ifx\stack@secnumdepth\@empty
\PackageWarning{tocvsec2}{There is no previous value for secnumdepth}%
\else
\afterassignment\gobble@secnumdepth
\expandafter\c@secnumdepth\expandafter\numexpr\stack@secnumdepth\@nil
\fi
}%<--- Was missing
}
\makeatother
\let\ORIchapter\chapter
\RenewDocumentCommand\chapter{som}{%
\IfBooleanTF{#1}
{
\setsecnumdepth{none}%
}
{%
\resetsecnumdepth*
}
\IfNoValueTF{#2}
{\ORIchapter{#3}}
{\ORIchapter[#2]{#3}}%
}
\setsecnumdepth{chapter}
\begin{document}
\chapter{A chapter}
\end{document}
会发生什么?在 中amsgen.sty
,\@ifstar
根据 获得一个新定义\new@ifnextchar
,它不会像 那样忽略空格\@ifnextchar
。
%
定义中的缺失导致\new@ifnextchar
看不到*
下一个字符,而是一个空格。
出现该问题是因为通过glossaries
加载。amsgen
amsmath