对于我的自定义课程我使用聪明人封装和定义新的自定义参考样式:
\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}