下面的文档采用回忆录类文档中的章节/节方案,使用自定义\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}
被注释掉就会发生!相反,它会产生预期的输出,包括以下第一页:
问题:
怎么了?
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}