
Окружение \title
макроса скобками \shorthandon{;:!?}
и \shorthandoff{;:!?}
дает ожидаемый результат на babel
языке french
(добавляется пробел перед «?», «!», «:» и «;»):
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
%
\shorthandon{;:!?}%
\title{La crise? Quelle crise?}
\shorthandoff{;:!?}%
%
\begin{document}
\maketitle
\end{document}
Но это не работает, если \shorthandon
и \shorthandoff
встроены в (переопределение) макроса \title
:
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
%
\let\titleORI\title
\renewcommand{\title}[1]{%
\shorthandon{;:!?}%
\titleORI{#1}%
\shorthandoff{;:!?}%
}
%
\title{La crise? Quelle crise?}
\author{Un auteur? Deux auteurs!}
%
\begin{document}
\maketitle
\end{document}
В чем причина? Есть ли способ обойти это?
решение1
Saying \shorthandon{?}
делает ?
активный символ. Таким образом, когда аргумент to \title
поглощается, в первом примере, он активен и, в \maketitle
, LaTeX будет использовать для него текущее определение, которое, как оказалось, определено babel-french
.
Напротив, во втором случае \shorthandon
команда выполняется, когда аргумент \title
уже был усвоен, поэтому ?
не активен и таким он останется навсегда (в тексте замены \@title
, который является макросом, где \title
хранится заголовок).
Вам придется отложить чтение аргумента после \shorthandon
его выполнения.
\documentclass[french]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\let\ORItitle\title
\renewcommand{\title}{%
\shorthandon{;:!?}%
\titlewithshorthand
}
\newcommand{\titlewithshorthand}[1]{%
\ORItitle{#1}%
\shorthandoff{;:!?}%
}
\title{La crise? Quelle crise?}
\begin{document}
\maketitle
\end{document}
Но я бы просто поставил \title
после \begin{document}
.