我正在使用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}