![为非英语语言重新定义 \cref](https://linux22.com/image/393113/%E4%B8%BA%E9%9D%9E%E8%8B%B1%E8%AF%AD%E8%AF%AD%E8%A8%80%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%20%5Ccref.png)
是否可以定义另一个\frcref
类似于的命令\cref
,但当调用它时,例如\frcref{ch:chapter1}
,它在超链接中显示法语单词“Chapitre”而不是英文单词“Chapter”?(\cref
仍然应该打印英文单词。)
答案1
您可以直接\cref
用例如将命令括起来\foreignlanguage
,前提是您已将语言传递给babel
和cleveref
:
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage[danish,french,main=british]{babel}
\usepackage[danish,french,english]{cleveref}
\begin{document}
\chapter{Test}
\label{chap-test}
\Cref{chap-test}
\foreignlanguage{danish}{\Cref{chap-test}}
\foreignlanguage{french}{\Cref{chap-test}}
\end{document}
cleveref
请注意french
不喜欢某些字符,包括:
标签中的字符。
您可以在新的宏中捕获此信息,例如
\newcommand{\fCref}[1]{\foreignlanguage{french}{\Cref{#1}}}
但是,下面我更进一步定义了一个命令\newcreflang
,其效果是
\newcreflang{f}{french}
一次性定义\fcref
和\fCref
。此命令可以进一步扩展,以创建来自的其他宏的类似物cleveref
。
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
\usepackage[swedish,french,main=british]{babel}
\usepackage[swedish,french,english]{cleveref}
\makeatletter
\newrobustcmd{\@mlcref}[3]{\foreignlanguage{#1}{\@cref{#2}{#3}}}
\newcommand{\newcreflang}[2]{%
\csgdef{@#1cref}##1##2{\@mlcref{#2}{##1}{##2}}%
\csgdef{#1cref}##1{\csuse{@#1cref}{cref}{##1}}%
\csgdef{#1Cref}##1{\csuse{@#1cref}{Cref}{##1}}}
\makeatother
\newcreflang{sw}{swedish}
\newcreflang{f}{french}
\begin{document}
\chapter{Test}
\label{chap-test}
\Cref{chap-test}
\swCref{chap-test} or ``\swcref{chap-test,chap-test-2}'' or
``\swcref{chap-test,chap-test-2,chap-test-3}''
\fCref{chap-test} or
``\fcref{chap-test,chap-test-2}'' or
``\fcref{chap-test,chap-test-2,chap-test-3}''
\chapter{Test 2}
\label{chap-test-2}
\chapter{Test 3}
\label{chap-test-3}
\end{document}
(我已将另一种语言从丹麦语切换为瑞典语,因为目前丹麦语设置中存在错误,cleveref
我会向软件包作者报告。)