使用pdflatex
我babel
有这个代码(取自答案这个问题\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
,我只留下了第二次声明。