更新 2016.06.15

更新 2016.06.15

我正在重新定义一些东西来支持多语言文档中的独特引用,例如从用户的角度来看,标签在给定区域内必须是唯一的(显然它们必须始终是唯一的):

\label
\ref
\autoref
\nameref

因为我正在使用hyperref,它在 处定义它们\AtBeginDocument,所以我需要在那一点获取它们的定义。


更新 2016.06.15

我意识到\addlabelsuffix只能在 BODY 中调用。由于我\setlocale有时会在之前调用\begin{document},因此我需要\addlabelsuffix从该宏中删除。它将在\inputlanguagefile未在此处显示的单独宏中被调用。如果您\addlabelsuffix在之前尝试使用\begin{document},那么您可能会遇到宏受保护的问题 - 可能是由于\hyperref


问题

  1. 我肯定很累,因为我的例子看起来不错,但输出却不如预期。挪威语部分没有显示为一个部分。
  2. 我还注意到,\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}

在此处输入图片描述

相关内容