从命令调用 \creflabelformat 时出现问题

从命令调用 \creflabelformat 时出现问题

我正在使用cleveref带有一些自定义的包,使用\creflabelformat。因为cleveref应该是最后一个要加载的包,并且自定义命令应该在cleveref加载之后,所以我想有一个\loadCleveref加载cleveref和执行自定义的命令。这样,我就可以\loadCleveref在我的标准自定义包中定义(即使cleveref尚未加载),然后\loadCleveref在文档序言的末尾附近调用。

\creflabelformat{snipCounter}{(S#2#1#3)}当我从内部调用时出现问题\loadCleveref:我得到了Illegal parameter number in definition of \loadCleveref似乎在抱怨#字符的提示。据推测,它被字符搞糊涂了,以为我指的是不存在的 \loadCleveref` 参数。

有没有办法\creflabelformat{snipCounter}{(S#2#1#3)}从宏内部执行该命令?

首先,什么是有效的(即,当我不尝试cleveref从命令加载时):

\documentclass{article}
%\newcommand{\loadCleveref}{%
    \usepackage[nameinlink,noabbrev]{cleveref}
    \crefname{snipCounter}{snippet}{snippets}
    \Crefname{snipCounter}{Snippet}{Snippet}
    \creflabelformat{snipCounter}{(S#2#1#3)}
%}
%\loadCleveref
\newcounter{snipCounter}
\newenvironment{codeSnip}%
    {\refstepcounter{snipCounter}\begin{minipage}[c]{0.8\textwidth}}%
    {\end{minipage}\begin{minipage}[c]{0.2\textwidth}\hspace*{\stretch{1}}(S\thesnipCounter)\end{minipage}%
    \bigskip
    }%
\begin{document}
\begin{codeSnip}
\label{aSnippetLabel}
\texttt{A code snippet}
\end{codeSnip}
\Cref{aSnippetLabel} is a snippet of code.
\end{document}

输出结果如下: 在此处输入图片描述

当我取消注释如下命令时,就会出现\newcommand{\loadCleveref}错误\loadCleveref

\documentclass{article}
\newcommand{\loadCleveref}{%
    \usepackage[nameinlink,noabbrev]{cleveref}
    \crefname{snipCounter}{snippet}{snippets}
    \Crefname{snipCounter}{Snippet}{Snippet}
    \creflabelformat{snipCounter}{(S#2#1#3)}
}
\loadCleveref
\newcounter{snipCounter}
\newenvironment{codeSnip}%
    {\refstepcounter{snipCounter}\begin{minipage}[c]{0.8\textwidth}}%
    {\end{minipage}\begin{minipage}[c]{0.2\textwidth}\hspace*{\stretch{1}}(S\thesnipCounter)\end{minipage}%
    \bigskip
    }%
\begin{document}
\begin{codeSnip}
\label{aSnippetLabel}
\texttt{A code snippet}
\end{codeSnip}
\Cref{aSnippetLabel} is a snippet of code.
\end{document}

答案1

#如果将定义中的每个 替换\loadCleveref为,它就会起作用##

在宏定义中,#<number>被解释为所定义命令的参数(但\loadCleveref没有任何参数),并且##<number>被解释为#<number>在定义之外被解释。

有关此内容的更多信息,请参见这个答案


这是您的 MWE,#替换为##

\documentclass{article}
\newcommand{\loadCleveref}{%
    \usepackage[nameinlink,noabbrev]{cleveref}
    \crefname{snipCounter}{snippet}{snippets}
    \Crefname{snipCounter}{Snippet}{Snippet}
    \creflabelformat{snipCounter}{(S##2##1##3)}
}
\loadCleveref
\newcounter{snipCounter}
\newenvironment{codeSnip}%
    {\refstepcounter{snipCounter}\begin{minipage}[c]{0.8\textwidth}}%
    {\end{minipage}\begin{minipage}[c]{0.2\textwidth}\hspace*{\stretch{1}}(S\thesnipCounter)\end{minipage}%
    \bigskip
    }%
\begin{document}
\begin{codeSnip}
\label{aSnippetLabel}
\texttt{A code snippet}
\end{codeSnip}
\Cref{aSnippetLabel} is a snippet of code.
\end{document}

在此处输入图片描述

相关内容