我正在重新定义一些东西来支持多语言文档中的独特引用,例如从用户的角度来看,标签在给定区域内必须是唯一的(显然它们必须始终是唯一的):
\label
\ref
\autoref
\nameref
因为我正在使用hyperref
,它在 处定义它们\AtBeginDocument
,所以我需要在那一点获取它们的定义。
更新 2016.06.15
我意识到\addlabelsuffix
只能在 BODY 中调用。由于我\setlocale
有时会在之前调用\begin{document}
,因此我需要\addlabelsuffix
从该宏中删除。它将在\inputlanguagefile
未在此处显示的单独宏中被调用。如果您\addlabelsuffix
在之前尝试使用\begin{document}
,那么您可能会遇到宏受保护的问题 - 可能是由于\hyperref
。
问题
- 我肯定很累,因为我的例子看起来不错,但输出却不如预期。挪威语部分没有显示为一个部分。
- 我还注意到,
\autoref
在我的实际文档中, 是受保护的,因此存在扩展问题 (##1-#1
)。我不确定是什么在保护它。有什么想法是哪些软件包影响了这一点?在示例代码中,它似乎没有受到保护(用 测试\show\autoref
)。
例子
\documentclass{article}
\usepackage{fontspec}
\usepackage{hyperref}
\usepackage{xstring}
\AtBeginDocument{% Must come after hyperref (because hyperref modifies \label and \ref system)
\let\oldlabel\label% Copy original
\let\oldref\ref% Copy original
\let\oldautoref\autoref% Copy original
}
\newcommand{\addlabelsuffix}[1]{%
\renewcommand{\label}[1]{\oldlabel{##1-#1}}% Update % This works
\renewcommand{\ref}[1]{\oldref{##1-#1}}% Update % This works
\renewcommand{\autoref}[1]{\oldautoref{##1-#1}}% Update
%\show\autoref
}
\newcommand{\locale}{en-US}% Set default locale
\DeclareRobustCommand{\setlocale}[1]{%
\renewcommand{\locale}{#1}
\addlabelsuffix{#1}% keep labels unique
\IfEq{#1}{en-US}{%
\renewcommand{\sectionautorefname}{Section}
}
\IfEq{#1}{de-AT}{%
\renewcommand{\sectionautorefname}{Kapitel}
}
\IfEq{#1}{nn-NO}{%
\renewcommand{\sectionautorefname}{Kapittel}
}
}%
\begin{document}
\setlocale{en-US}% set locale
\section{US English}
\label{test}
First sentence \autoref{test}.
\setlocale{de-AT}% set locale
\section{Austrian German}
\label{test}
First sentence \autoref{test}.
\setlocale{nn-NO}% set locale
\section{Norwegian}
\label{test}
First sentence \autoref{test}.
\end{document}
输出
答案1
该命令末尾\IfEq{foo}{foobar}{true}{false}
有一个true
/参数对——这在 的定义中的所有测试中都是缺失的,因此等被吞噬,导致在这里被省略。false
\setlocale
\section
\documentclass{article}
\usepackage{fontspec}
\usepackage{xstring}
\usepackage{hyperref}
\AtBeginDocument{% Must come after hyperref (because hyperref modifies \label and \ref system)
\let\oldlabel\label% Copy original
\let\oldref\ref% Copy original
\let\oldautoref\autoref% Copy original
}
\newcommand{\addlabelsuffix}[1]{%
\renewcommand{\label}[1]{\oldlabel{##1-#1}}% Update % This works
\renewcommand{\ref}[1]{\oldref{##1-#1}}% Update % This works
\renewcommand{\autoref}[1]{\oldautoref{##1-#1}}% Update
%\show\autoref
}
\newcommand{\locale}{en-US}% Set default locale
\AtBeginDocument{%
\DeclareRobustCommand{\setlocale}[1]{%
\renewcommand{\locale}{#1}%
\addlabelsuffix{#1}% keep labels unique
\IfEq{#1}{en-US}{%
\renewcommand{\sectionautorefname}{Section}
}{}%
\IfEq{#1}{de-AT}{%
\renewcommand{\sectionautorefname}{Kapitel}
}{}%
\IfEq{#1}{nn-NO}{%
\renewcommand{\sectionautorefname}{Kapittel}
}{}%
}%
}
\begin{document}
\setlocale{en-US}% set locale
\section{US English}
\label{test}
First sentence \autoref{test}.
\setlocale{de-AT}% set locale
\section{Austrian German}
\label{test}
First sentence \autoref{test}.
\setlocale{nn-NO}% set locale
\section{Norwegian}
\label{test}
First sentence \autoref{test}.
\end{document}
答案2
您忘记了一个论点\IfEq
:
\IfEq{<string-a>}{<string-b>}{<true>}{<false>}
和 缺少错误分支。此外,\ref
和\autoref
是“健壮”命令,因此最好用于\LetLtxMacro
保存它们的副本。
\documentclass{article}
%\usepackage{fontspec}
\usepackage{xstring}
\usepackage{letltxmacro}
\usepackage{hyperref}
\AtBeginDocument{% Must come after hyperref (because hyperref modifies \label and \ref system)
\let\oldlabel\label% Copy original
\LetLtxMacro\oldref\ref% Copy original
\LetLtxMacro\oldautoref\autoref% Copy original
}
\newcommand{\addlabelsuffix}[1]{%
\renewcommand{\label}[1]{\oldlabel{##1-#1}}% Update % This works
\renewcommand{\ref}[1]{\oldref{##1-#1}}% Update % This works
\renewcommand{\autoref}[1]{\oldautoref{##1-#1}}% Update
}
\newcommand{\locale}{en-US}% Set default locale
\DeclareRobustCommand{\setlocale}[1]{%
\renewcommand{\locale}{#1}%
\addlabelsuffix{#1}% keep labels unique
\IfEq{#1}{en-US}{%
\renewcommand{\sectionautorefname}{Section}%
}{}%
\IfEq{#1}{de-AT}{%
\renewcommand{\sectionautorefname}{Kapitel}%
}{}%
\IfEq{#1}{nn-NO}{%
\renewcommand{\sectionautorefname}{Kapittel}%
}{}%
}
\begin{document}
\setlocale{en-US}% set locale
\section{US English}
\label{test}
First sentence \autoref{test}.
\setlocale{de-AT}% set locale
\section{Austrian German}
\label{test}
First sentence \autoref{test}.
\setlocale{nn-NO}% set locale
\section{Norwegian}
\label{test}
First sentence \autoref{test}.
\end{document}