为什么 memoir 中的 \secref 命令与 cleveref 和 nomencl 不再起作用

为什么 memoir 中的 \secref 命令与 cleveref 和 nomencl 不再起作用

下面的文档采用回忆录类文档中的章节/节方案,使用自定义\secref命令。此命令允许引用缩写形式“section s”中的节,该节通常以完整形式“section cs”显示。此处 c 是章节编号,s 是节编号。

\secref命令由 Christian Hupfer 提供,来自他在仅引用小数点后的部分章节编号

本文档用于编译,没有错误。

但现在却出现这个错误:

./secref-try.tex:40: Use of \@stripdot doesn't match its definition.
<argument> 1
            .2
l.40 In section \secref{sec:more}
                              %% ERROR WITH \@stripdot here

以下是文档:

\documentclass[12pt]{memoir}  

%% NOTATION INDEX
\usepackage[nocfg]{nomencl}

%%%%%%%%  BEGIN CROSS-REFERENCING COMMANDS  %%%%%%%%
\RequirePackage{hyperref} 
\hypersetup{colorlinks,linkcolor=red}

% Added to allow ref to section n, not section m.n
%    ``trickier' 'code by Christian Hupfer, from
%   https://tex.stackexchange.com/questions/383606/reference-with-just-part-of-section-number-after-decimal-point
\makeatletter
\let\@xp\expandafter
% Stripping the dot from the 1.2 -like reference
\def\@@stripdot#1.#2\@nil{#2}
% Stripping the memoir stuff from the reference, 
%    i.e. \M@TitleReference {1.2}{FOO} and handing #1 (1.2) over to the \@@stripdot macro
\def\@stripdot\M@TitleReference #1#2\@nil{\@@stripdot#1\@nil}
% Macro, second level of expansion
\newcommand{\stripdot}[1]{%
  \@xp\@stripdot#1\@nil
}
\newcommand{\secref}[1]{%
% Expand the argument first
  \IfRefUndefinedExpandable{#1}{%
  % Do nothing if #1 is not defined
  }{%
    \hyperlink{\getrefbykeydefault{#1}{anchor}{}}{\@xp\stripdot\@xp{\getrefnumber{#1}}}%
  }%
}
\makeatother

\usepackage[nameinlink,capitalize]{cleveref}

%%%%%%%%  END CROSS-REFERENCING COMMANDS  %%%%%%%%

\begin{document}

In section \secref{sec:more} %% ERROR WITH \@stripdot here
of \cref{chap:one} \dots .

And in \cref{sec:one} \dots .

\chapter{One}\label{chap:one}

  \section{About one}\label{sec:one}

  \section{More about one}\label{sec:more}

\chapter{Two}

In section \ref{sec:more}

\end{document}

错误确实不是如果\usepackage[nocfg]{nomencl}被注释掉就会发生!相反,它会产生预期的输出,包括以下第一页:

\secnum 的输出结果 OK,不含 nomencl 包

问题:

怎么了?

nomencl(2019/02/08 的 5.1 版确实有变化)、cleveref、hyperref 甚至 memoir 最近有什么变化吗?

答案1

我不能告诉你为什么Christian Hupfer 的答案中“棘手”部分的代码对您不起作用。但是,正如我在评论中指出的那样,“第三期“Christian 的回答似乎效果很好。

(请注意,以下代码要求xassoccnt使用软件包的 1.5 版或更新版本。)

在此处输入图片描述

\documentclass[12pt]{memoir}  
\usepackage[nocfg]{nomencl}
\RequirePackage[colorlinks]{hyperref} 

%% The following code is from the 'third instalment' 
%% block of the answer posted by Christian Hupfer at 
%% https://tex.stackexchange.com/a/383608
\usepackage{xparse,xassoccnt}
\usepackage[user,hyperref]{zref}
\RegisterPostLabelHook{\zlabel}
\makeatletter
% Replace \arabic{section} with \Roman{section} etc. as needed:
\zref@newprop{section}{\arabic{section}} 
\zref@addprop{main}{section}
\newcommand{\secref}[1]{%
  \zref@ifrefundefined{#1}{%
    \ref{#1}}{%
    \hyperlink{\zref@extract{#1}{anchor}}%
       {\zref@extract{#1}{section}}}}
\makeatother
%% End of code from Christian Hupfer's answer

\usepackage[nameinlink]{cleveref}

\begin{document}
Section \secref{sec:two} of \cref{chap:one} 

\Cref{sec:two} of \cref{chap:one} 

Section \ref{sec:two} of \cref{chap:one} 


\chapter{One}\label{chap:one} \dots
\section{About one}\label{sec:one} \dots
\section{About two}\label{sec:two} \dots
\end{document}

相关内容