为非英语语言重新定义 \cref

为非英语语言重新定义 \cref

是否可以定义另一个\frcref类似于的命令\cref,但当调用它时,例如\frcref{ch:chapter1},它在超链接中显示法语单词“Chapitre”而不是英文单词“Chapter”?(\cref仍然应该打印英文单词。)

答案1

您可以直接\cref用例如将命令括起来\foreignlanguage,前提是您已将语言传递给babelcleveref

示例输出

\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我会向软件包作者报告。)

相关内容