在撰写多语言文档时,如果某个定理标题在不同语言中对应有不同的名称,则有两种方式可以引用它们:
使用其原本出现的名称。例如,如果一个定理在英文环境中被命名为“Theorem”,那么后来即使在法文环境中引用它,它仍然被称为“Theorem”。
使用当前上下文对应的名称。例如,如果一个定理在英文上下文中写成“Theorem”,而之后在法文上下文中引用时,它就被称为“Théorème”。
在我的包中ProjLib
,第一种命名方式叫originalref
,第二种叫 ,regionalref
它们的实现方式大致如下:
originalref
:为不同的语言定义单独的环境,例如theoremenglish
,,theoremfrench
每个都有其\crefname
配置,并定义主环境以选择与上下文相对应的适当的环境。regionalref
:仅定义单个环境theorem
,并定义它的\crefname
be\csname theoremname\languagename\endcsname
和它的复数,这些名称\theoremnameenglish
在\theoremnamefrench
语言配置文件中设置。
该模式虽然regionalref
运行良好,但是originalref
定义了太多环境并设置\crefname
了太多次,因此速度相当慢。
当我用 重写这个包时expl3
,我想借此机会找到一种新的实现方式。例如,是否有某种方法可以\languagename
在设置标签时记录 的值,并将其反映在引用文本中?(这只是一个粗略的想法,我从来没有弄清楚它实际上如何工作)
你有什么想法吗?提前感谢你的任何建议〜
你可以通过这个演示文档来查看这两种模式的效果(并且感受一下这种originalref
模式有多慢 ;) ):
%! TEX program = xelatex
\documentclass[regionalref]{einfart}
% \documentclass[originalref]{einfart}
\usepackage{ProjLib}
\begin{document}
\UseLanguage{English}
Current language: \languagename
\begin{theorem}\label{thm1}
In English.
\end{theorem}
\cref{thm1,thm2}
\vspace{2cm}
\UseLanguage{French}
Current language: \languagename
\begin{theorem}\label{thm2}
In French.
\end{theorem}
\cref{thm1,thm2}
\end{document}
regionalref
:
originalref
:
答案1
我不确定你到底想如何与 cleveref 交互,但我认为你正在寻找类似的东西属性(自 2023/11/1 版本起可用)。您可以定义一个新属性,例如
\NewProperty{language}{now}{english}{\languagename}
并使用 与\RecordProperties{<label>}{<list of properties>}
使用 相同的方式捕获属性\label
,然后使用 引用属性\RefProperty{<label>}{<property>}
。以下是使用上述定义的language
属性的示例:
\documentclass[regionalref]{einfart}
% \documentclass[originalref]{einfart}
\usepackage{ProjLib}
\NewProperty{language}{now}{english}{\languagename}
\begin{document}
\UseLanguage{English}
Current language: \languagename
\begin{theorem}\RecordProperties{thm1}{label,language}
In English.
\end{theorem}
\vspace{2cm}
\UseLanguage{French}
Current language: \languagename
\begin{theorem}\RecordProperties{thm2}{label,language}
In French.
\end{theorem}
\RefProperty{thm1}{label}\par
\RefProperty{thm1}{language}\par
\RefProperty{thm2}{label}\par
\RefProperty{thm2}{language}\par
\end{document}