该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
在这里输入。