我想添加与语言相关的连词cleveref
。我认为
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{cleveref}
\addto\captionsngerman{%
\crefname{section}{Abschnitt}{Abschnitte}%
\newcommand{\crefpairconjunction}{ und }%
}
\begin{document}
\section{title}\label{1}
\section{title}\label{2}
\cref{1,2}
\end{document}
应该可以工作(并且输出确实正确)。但是我得到了错误Command \crefpairconjunction already defined. \select@language{ngerman}
。如果我更改\newcommand
为\renewcommand
,错误就变成\crefpairconjunction undefined. \select@language{ngerman}
。
我究竟做错了什么?
答案1
添加到德语字幕的代码不是只添加一次,而是被调用多次,因此第一次使用后就没有问题,但在下一次调用中\crefpairconjunction
已经定义,并且不能再次定义,除非使用\renewcommand
。
可以在\typeout{foo}
之后或之前看到添加代码的多次调用\crefname...
——您将在终端等屏幕上看到 3 个“foo”。
一种可能性是定义一个全局变量,该全局变量在开始时为空或具有某些默认值,然后在使用时\crefpairconjunction
重新定义它以进行扩展或检查其是否存在。und
\addto\captions....
\@ifundefined
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{cleveref}
\makeatletter
\addto\captionsngerman{%
\crefname{section}{Abschnitt}{Abschnitte}%
\@ifundefined{crefpairconjunction}{\newcommand{\crefpairconjunction}{ und }}{}%
}
\makeatother
\begin{document}
\section{title}\label{1}
\section{title}\label{2}
\cref{1,2}
\end{document}
答案2
只需提供默认值,然后使用\renewcommand
:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{cleveref}
\providecommand\crefpairconjunction{ and }
\addto\captionsngerman{%
\crefname{section}{Abschnitt}{Abschnitte}%
\renewcommand{\crefpairconjunction}{ und }%
}
\begin{document}
\section{title}\label{1}
\section{title}\label{2}
\cref{1,2}
\end{document}