调整 Babel 特定代码以适应 XeLaTeX 中的多语言功能

调整 Babel 特定代码以适应 XeLaTeX 中的多语言功能

使用pdflatexbabel有这个代码(取自答案这个问题\autoref)重新定义从包中打印我的参考文献的方式hyperref,它还会自动添加所引用内容的相应页码:

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{hyperref}
\addto\extrasngerman{
\def\subsectionautorefname{Abschnitt} % subsection autoref -> Abschnitt ... 
\def\subsubsectionautorefname{Abschnitt} % subsubsection autoref -> Abschnitt ... 
\def\pageautorefname{S.}} % Was vor der Seitenzahl in der Klammer der Referenz steht
\let\oldautoref\autoref 
\renewcommand{\autoref}[1]{\oldautoref{#1} (\autopageref{#1})} % autoref prints respective pagenumber

% No pagenumber if the reference is on the same page
\usepackage{ifthen}
\newcounter{cPage}
\renewcommand{\autoref}[1]{\oldautoref{#1}%
\refstepcounter{cPage}\label{current\thecPage}%
 \ifthenelse{\equal{\pageref{#1}}{\pageref{current\thecPage}}}%
  {}{~(\autopageref{#1})}}

\begin{document}

\section{Einleitung}\label{sec:intro}
\newpage
Text. \autoref{sec:intro}

\end{document}

使用XeLaTeX和 因此polyglossia代替babel,我该如何调整此代码以实现相同的输出? 可能吗?

MWE(代表XeLaTeX):

\documentclass{article}

\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage[]{german}

\usepackage[german]{hyperref}

\addto\extrasngerman{
\def\subsectionautorefname{Abschnitt} % subsection autoref -> Abschnitt ... 
\def\subsubsectionautorefname{Abschnitt} % subsubsection autoref -> Abschnitt ... 
\def\pageautorefname{S.}} % Was vor der Seitenzahl in der Klammer der Referenz steht
\let\oldautoref\autoref 
\renewcommand{\autoref}[1]{\oldautoref{#1} (\autopageref{#1})} % autoref druckt automatisch die zugehörige Seitenzahl

% No pagenumber if the reference is on the same page
\usepackage{ifthen}
\newcounter{cPage}
\renewcommand{\autoref}[1]{\oldautoref{#1}%
\refstepcounter{cPage}\label{current\thecPage}%
 \ifthenelse{\equal{\pageref{#1}}{\pageref{current\thecPage}}}%
  {}{~(\autopageref{#1})}}

\begin{document}

\section{Einleitung}\label{sec:intro}
\newpage
Text. \autoref{sec:intro}

\end{document}

答案1

如果你只使用一种语言,就没有必要走这\extrasngerman条路,即使有babel

\documentclass{article}

\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{ifthen}
\usepackage{letltxmacro}

\usepackage[german]{hyperref}

\setmainlanguage[]{german}


\renewcommand\subsectionautorefname{Abschnitt} % subsection autoref -> Abschnitt ... 
\renewcommand\subsubsectionautorefname{Abschnitt} % subsubsection autoref -> Abschnitt ... 
\renewcommand\pageautorefname{S.} % Was vor der Seitenzahl in der Klammer der Referenz steht

\LetLtxMacro\oldautoref\autoref % NOT \let

% No pagenumber if the reference is on the same page
\newcounter{cPage}
\renewcommand{\autoref}[1]{%
  \oldautoref{#1}%
  \refstepcounter{cPage}\label{current\thecPage}%
  \ifthenelse{\equal{\pageref{#1}}{\pageref{current\thecPage}}}%
    {}
    {~(\autopageref{#1})}%
}

\begin{document}

\section{Einleitung}\label{sec:intro}

\newpage

Text. \autoref{sec:intro}

\end{document}

这样做\let\oldautoref\autoref非常危险,因为\autoref这是“强行”命令。请\LetLtxMacro按照指示使用。

我发现最好先声明所有包,然后再进行设置。这有助于文档的维护。

我认为没有理由做\renewcommand两次\autoref,我只留下了第二次声明。

在此处输入图片描述

相关内容