如何使自定义 \crefformat 依赖于 babel 选择的语言?

如何使自定义 \crefformat 依赖于 babel 选择的语言?

对于我的自定义课程我使用封装和定义新的自定义参考样式

\crefformat{figure}{Meine tolle Abbildung ~#2#1#3}

有没有办法让这个命令考虑选择的语言? 喜欢:

\crefformat[ngerman]{figure}{meine tolle Abbildung ~#2#1#3}
\crefformat[english]{figure}{my fancy figure ~#2#1#3}

所以我得到了我选择的正确输出

\usepackage[english]{babel}

手册指出,类似这样的操作是没有问题的:

\crefformat{equation}{#2\cref@equation@name~(#1)#3}

但我不知道如何将其应用到我的情况中。


编辑:

我发现了一个繁琐的解决方案我自己可以做到,但我更喜欢不需要用 babel 加载所有语言的版本(虽然我不知道这是否一定是件坏事,我只是猜测它有点过头了)。


梅威瑟:

\documentclass{article}

\usepackage[demo]{graphicx}
\usepackage[english]{babel}
\usepackage{hyperref}
\usepackage{cleveref}

\crefformat{figure}{Abb.~#2#1#3}

\begin{document}
    \cref{fig:one}

    \begin{figure}[h]
        \includegraphics[width=\textwidth]{example-image-a}
        \caption{I am a figure\label{fig:one}}
    \end{figure}

\end{document}

答案1

正如 cleveref 手册中所说,您需要将\crefformat命令挂接到 babel 的语言切换机制中。babel 文档中对此进行了详细说明,但基本上您需要将\crefformat定义添加到相应的\extras<language>宏中。

Cleveref 提供了一个方便的宏\cref@addlanguagedefs来实现这一点(它的优点是也适用于 polyglossia 包)。将以下内容添加到您的序言中即可实现此目的:

\makeatletter
\cref@addlanguagedefs{english}{%
  \crefformat{figure}{my fancy figure~#2#1#3}}
\cref@addlanguagedefs{ngerman}{%
  \crefformat{figure}{meine tolle Abbildung~#2#1#3}}
\makeatother

还有一个问题。这会将格式更改挂接到 babel 的语言切换中,但它实际上并没有设置格式,直到您切换语言。(可以说 cleveref 应该为您完成此操作 - 也许我会在将来的版本中修复此问题。)设置初始格式的最简单方法可能是在\selectlanguage{ngerman}文档的最开头添加一个命令。

另外,你应该小心阅读 cleveref 手册中有关在何处传递语言选项的说明。基本上,您应该将语言选项传递给\documentclass不是就像\usepackage{babel}在您的 MWE 中一样。否则 cleveref 将不会执行您想要的操作。

(题外话:我不确定为什么你~\crefformat定义中要在前面加一个空格。~插入一个不间断的空格,所以你几乎肯定不希望在它前面有额外的空格字符。我已经在\crefformat上面给出的定义中修复了这个问题。)

以下是演示上述所有内容的完整 MWE:

\documentclass[english,ngerman]{article}

\usepackage[demo]{graphicx}
\usepackage{babel}
\usepackage{hyperref}
\usepackage{cleveref}

\makeatletter
\cref@addlanguagedefs{english}{%
  \crefformat{figure}{my fancy figure~#2#1#3}}
\cref@addlanguagedefs{ngerman}{%
  \crefformat{figure}{meine tolle Abbildung~#2#1#3}}
\makeatother

\begin{document}
\selectlanguage{ngerman}
    \cref{fig:one}

    \begin{figure}[h]
        \includegraphics[width=\textwidth]{example-image-a}
        \caption{I am a figure\label{fig:one}}
    \end{figure}

\selectlanguage{english}
\cref{fig:one}

\selectlanguage{ngerman}
\cref{fig:one}

\end{document}

请注意,由于您只更改了用于图形的名称,因此您也可以使用更高级别的\crefname命令而不是 来完成您想要的一切\crefformat。这样做的好处是可以自动定义所有其他变体 - 复数、参考范围等 - 否则需要在任何实际文档中手动将其添加到上述 MWE 中:

\documentclass[english,ngerman]{article}

\usepackage[demo]{graphicx}
\usepackage{babel}
\usepackage{hyperref}
\usepackage{cleveref}

\makeatletter
\cref@addlanguagedefs{english}{%
  \crefname{figure}{my fancy figure}{my fancy figures}}
\cref@addlanguagedefs{ngerman}{%
  \crefname{figure}{meine tolle Abbildung}{meine tolle Abbildungen}}
\makeatother


\begin{document}
\selectlanguage{ngerman}
\cref{fig:one}

\begin{figure}[h]
  \includegraphics[width=\textwidth]{example-image-a}
  \caption{I am a figure\label{fig:one}}
\end{figure}

\selectlanguage{english}
\cref{fig:one}

\selectlanguage{ngerman}
\cref{fig:one}

\end{document}

也许在加载 babel 或 polyglossia 时,可以向 等添加可选的语言参数,以便在多语言文档中稍微简化这一点。另一方面,只要您对默认格式\crefname\crefformat名称感到满意,cleveref 中的语言切换就可以“开箱即用”。超越这一点并自定义默认语言字符串似乎需要在其他软件包(例如 varioref)中非常类似的解决方案。而上述机制在 babel 文档中有解释。有充分的理由让 cleveref 的工作方式与其他包相同。

答案2

一种选择是使用伊夫兰包来获取命令

\IfLanguageName{<lang>}{<then>}{<else>}

并将其放入一个简单的嵌套 if 条件中。

\IfLanguageName{ngerman}{% then
    \crefformat{figure}{tolle Abb.~#2#1#3}
    }{% else
    \IfLanguageName{english}{% then
        \crefformat{figure}{fancy fig.~#2#1#3}
    }{% else
    }
}

缺点是需要加载此 if 条件中包含的所有语言并选择一种。在我看来,这似乎有点过头了,我很感激任何更简单的解决方案。

\usepackage[ngerman,english]{babel}
\selectlanguage{ngerman}

梅威瑟:

\documentclass{article}

\usepackage[demo]{graphicx}

\usepackage[ngerman,english]{babel}
\selectlanguage{ngerman}

\usepackage{cleveref}
\usepackage{iflang}

\IfLanguageName{ngerman}{% then
    \crefformat{figure}{tolle Abb.~#2#1#3}
    }{% else
    \IfLanguageName{english}{% then
        \crefformat{figure}{fancy fig.~#2#1#3}
    }{% else
    }
}

\begin{document}

    \cref{fig:one}

    \begin{figure}[h]
        \includegraphics[width=\textwidth]{example-image-a}
        \caption{I am a figure\label{fig:one}}
    \end{figure}

\end{document}

相关内容