\AfterEndPreamble 是否真的在任何 \AtBeginDocument 代码之后执行代码?

\AfterEndPreamble 是否真的在任何 \AtBeginDocument 代码之后执行代码?

babel包通过命令\AtBeginDocument(其内核的第 12.256 和 12.257 行)在开始文档时加载(最后一种)语言:

\AtBeginDocument{%
\expandafter\selectlanguage\expandafter{\bbl@main@language}}

另一方面,\AfterEndPreamble来自etoolbox包的命令应该执行“\begin{document}在任何\AtBeginDocument代码之后,在最末尾的代码 [...]”。

但以下 MCE 中似乎并非如此:

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{babel}
%
\AfterEndPreamble{%
  \title{Quelle crise?}%
}
%
\begin{document}
\maketitle
\end{document}

确实,如果在加载法语之后执行,\title{Quelle crise?}应该在“?”之前留出一个细空格,就像以下 MCE 中的情况一样:

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{babel}
\begin{document}
\title{Quelle crise?}
\maketitle
\end{document}

答案1

Babel的语言french使?active 成为简写。然而,这样做是\begin{document}为了避免干扰其他包的加载。然而,您已\title在序言中指定 \begin{document}稍后执行并不重要。只有时间才是重要的,代码何时执行并翻译成标记。

解决方案:您可以在序言中暂时启用简写:

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}
\usepackage{babel}
%
\shorthandon{?}
\AfterEndPreamble{%
  \title{Quelle crise?}%
}
\shorthandoff{?}
%
\begin{document}
\maketitle
\end{document}

结果

不带\shorthandon{?}问号的 catcode 为 12(其他),不被视为babel简写。带\shorthandon{?}问号的处于活动状态(catcode 为 13),在 时作为简写执行\maketitle。因此您不需要\AfterEndPreamble在这里输入。

相关内容