cleveref 中的语言相关连词

cleveref 中的语言相关连词

我想添加与语言相关的连词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}

相关内容